2

我正在为一个框架开发一个 Java 插件。

我已经编写了我的代码,使得 entryPoint 函数如下所示(考虑这是起点,主函数)

function entryPoint()
{
   try{
      //some code block
      subFunction1();
      subFunction2();
   }
   catch(Exception e) {}
   catch(IOException ioe) {}
   catch(NullPointerException npe){}
}

function subFunction1() throws IOException
{
    //some code
}

function subFunction2() throws NullPointerException
{
    //some code
}

所以想法是,所有的子函数都向主函数抛出特定的异常,我们在主函数中捕获这些异常并进行处理。

这种方式正确吗?如果没有,请提出更好的方法。

4

5 回答 5

10
  • 语句的顺序catch应该改变。由于第一个catch将匹配 all Exceptions,因此永远不会触发以下两个。

  • 在大多数情况下, AnNPE是意料之外的且不可恢复的。捕获它意味着应用程序能够从中恢复并无论如何运行。真的是这样吗?

  • 即使NPE是可恢复的,最好检查!= null而不是依赖命令流的异常。这是出于概念原因(基于异常的命令流需要更多代码,可读性较差,意图通常不清楚)以及性能原因。

  • 全部Exceptions被吞下 - 没有记录或重新投掷发生。这样,没有人会知道是否以及何时出现问题,因为没有记录异常。在大多数情况下,用户、其他开发人员和维护人员希望几乎所有异常都是真正异常的,因此会被记录下来。

于 2013-05-06T08:11:19.863 回答
1

不要捕获或抛出 NullPointerException 并且 Exception 的 catch 块应该是最后一个

于 2013-05-06T08:11:56.033 回答
0

我认为这种方法是完美的。应该尝试处理特定的异常,而不是一并处理。仅仅为了它而放置一个 try-catch 块不是使用它,而是滥用 try-catch 东西。

是的 Exception 应该是最后一个要处理的。错过了这个。

简而言之,您的意图是好的,并且在语法上您可以依赖编译器。

于 2013-05-06T08:11:11.730 回答
0

如果没有插件,您应该以与您相同的方式进行异常处理。这取决于您的应用程序,如果您可以在一种主要方法中处理所有异常。如果在某些情况下,您可以继续工作,那么这种方式可能会很困难。

关于插件,我唯一会做的就是一个全方位的“包罗万象”,也许还有一些特殊情况来做一些更详细的日志记录。如果框架自己不这样做,这也必须完成。

于 2013-05-06T08:13:27.400 回答
0

我认为最好在可以实际解决由此产生的问题的第一个可能的地方捕获异常。

一个例子:

function int divide(int a, int b) throws DivisionByZeroException {
    if(b == 0){
        throw new DivisionByZeroException();
    }
    return a / b;
}

function int doCalculationsAndStuff(int a, int b) throws DivisionByZeroException {
    int result = divide(a, b);
    ...
    return result; 
}

function void main() {
    try {
        int a = userInput();
        int b = userInput();
        int result = doCalculationsAndStuff(a, b);
        print("result: " + result);
    } catch(DivisionByZeroException e) {
        print("Division by zero happened. But i catched it for you =).");
    }
}

divide()在or中处理异常是没有意义的doCalculationsAndStuff()。因为如果除以零,你会返回什么值?没什么,这就是为什么我们抛出异常并main在我们给计算器应用程序的用户一些反馈的函数中处理它。

现在回到你的问题。如果该entryPoint功能是您可以解决子功能中出现的问题的第一个地方,那么这是处理它们的好地方。

于 2013-05-06T10:58:02.723 回答