我正在为框架开发Java插件。
我编写了我的代码,其入口点函数如下所示(考虑这是起点,主函数)
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
}
所以这个想法是,所有的子函数都会抛出主要函数的特定异常 我们在主要功能中捕获这些例外并进行处理。
这种方式是否正确?如果没有,请建议更好的方式。
答案 0 :(得分:10)
应更改catch
语句的顺序。由于第一个catch
将匹配所有Exceptions
,因此永远不会触发以下两个。
NPE
在大多数情况下是意外的,无法恢复。捕获它意味着应用程序能够从中恢复并运行。真的是这样吗?
即使NPE
可以恢复,最好还是检查!= null
而不是依赖命令流的异常。这是出于概念上的原因(基于异常的命令流需要更多代码,可读性更低,意图通常不清楚)以及性能原因。
吞下所有Exceptions
- 没有记录或重新抛出。这样,没有人会知道是否以及什么时候出错,因为没有记录异常。在大多数情况下,用户,其他开发人员和维护人员都希望几乎所有异常都是非常特殊的,因此可以记录。
答案 1 :(得分:1)
不要捕获或抛出NullPointerException,而Exception的catch块应该是最后一个
答案 2 :(得分:0)
我认为这种方法很完美。人们应该尝试处理特定的异常而不是处理所有异常。设置一个try-catch块只是为了它的使用不是使用它,而是滥用try-catch的东西。
是的,异常应该是最后一个要处理的。请注意这一点。
简而言之,你的意图很好,从语法上讲,你可以依赖编译器。
答案 3 :(得分:0)
如果没有插件,你应该像处理异常一样进行异常处理。这取决于您的应用程序,如果您可以在一个主要方法中处理所有异常。如果有案例,你可以继续工作,这可能很难这样。
关于插件,我唯一能做的就是全周围的'全能',也许还有一些特殊情况可以做更详细的日志记录。如果框架本身没有这样做,那么这也有待完成。
答案 4 :(得分: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()
或doCalculationsAndStuff()
处理异常是没有意义的。因为除零时你会得到什么价值?没有,这就是为什么我们抛出异常并在main
函数中处理它,我们给计算器应用程序用户一些反馈。
现在回到你的问题。如果entryPoint
函数是您可以解决子函数中出现的问题的第一个地方,那么这是处理它们的好地方。