【问题标题】:Exception Handling and Logging: Better Practice异常处理和日志记录:更好的实践
【发布时间】:2013-08-30 00:14:08
【问题描述】:

代码(Java)sn-p

.....
.....
 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 并继续 执行其余代码?

【问题讨论】:

    标签: java exception logging exception-handling


    【解决方案1】:

    在 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 引发异常会发生什么。在上面的代码 sn-p 中,这将导致记录所有异常,但只抛出最后一个异常。

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

    【讨论】:

      【解决方案2】:

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

      new UserAtWrongPlaceException( message ).printStackTrace();
      

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2011-07-08
        • 1970-01-01
        相关资源
        最近更新 更多