2

代码 (Java) 片段

.....
.....
 if ( response.check() == checkNumber )
 { 
        String message = "You are looking at Wrong Place";
        logger.log( message );
        throw new UserAtWrongPlaceException( message ); 
        /* stops here */
 }
 .....
 ...
 if ( response.check() == somethingElse)
 {
 ......
 }

我有代码来检查响应,如果响应等于定义的常量 checkNumber,我想记录消息并抛出异常,但这样做我的代码执行将在此时停止,而不是继续进行。

记录我的消息、抛出 UserAtWrongPlaceException 并继续执行其余代码的更好方法是什么?

4

2 回答 2

2

在 Java 中抛出异常总是会停止该方法的执行。它返回到调用该方法的任何代码段,但有异常。如果该代码捕获到异常,它会转到 catch 块,否则,它会进一步向上抛出异常。

也许您正在寻找一种将异常附加到日志的方法?记录器有一个方法:

logger.log(Level.INFO,message,new UserAtWrongPlaceException(message));

当然,你可以抛出一个随机异常,但如果你想让方法继续,你必须抓住它:

try {
    if(response.check() == checkNumber) {
        String message = "You are looking at Wrong Place";
        logger.log(message);
        throw new UserAtWrongPlaceException(message);
    }
} catch(UserAtWrongPlaceException e) {
    //Do something with the exception, or just ignore it.
}

但是,当然,您最好不要抛出异常,因为结果将是相同的,并且实例化异常只会减慢它的速度。

也许您正在寻找一种方法来继续该方法,但在最后抛出异常而不是成功返回。对于这种做法,我会将异常存储起来以备后用(尽管确实很复杂)。像这样:

UserAtWrongPlaceException exception = null;
if(response.check() == checkNumber) {
    String message = "You are looking at Wrong Place";
    logger.log(message);
    exception = new UserAtWrongPlaceException(message);
}
...
if(response.check() == somethingElse) { ... }
...
if(exception != null) {
    throw exception;
}
return true;

但是,如果您选择该模式,则必须查看如果多个这些 if 引发异常会发生什么。在上面的代码片段中,这将导致记录所有异常,但只抛出最后一个异常。

请记住,方法可以返回或抛出异常。它不能两者都做,也不能抛出多个异常。

于 2013-08-30T01:32:11.110 回答
1

如果您想打印堆栈跟踪但不停止执行,您可以使用:

new UserAtWrongPlaceException( message ).printStackTrace();
于 2013-08-30T00:21:03.170 回答