在决定是否允许方法避免异常时(例如:让异常传播)或者在收到异常后处理它时,您使用了什么guidlines?
这是我想要问的一个例子
如果我有三个方法method1,2,3和3. Method1调用Method2调用Method3。并且只在方法3中抛出异常,我应该让异常向上传播如下(请原谅我的伪java;))
method1 {
try {
call method2;
} catch (exception e) {
doErrorProcessing;
}
}
method2 throws exception {
call method3;
}
method3 throws exception {
call readFile;
}
一旦提出异常,我应该在什么时候处理
method1 {
call method2;
}
method2 {
call method3;
}
method3 {
try {
call readFille
} catch (exception e) {
doErrorProcessing;
}
}
答案 0 :(得分:7)
我遵循的规则:
如果我可以修复异常,或者使导致异常的问题无效(有时这意味着完全忽略它),我会处理它。否则它会被传递到下一个级别。
我总是尝试尽可能地将异常修复为树中的异常(即在它们发生之后尽快) - 这样可以对异常处理进行本地化处理,并避免在上层使用大的honkin'异常处理程序。
答案 1 :(得分:1)
像软件中的所有答案一样,对我来说这个答案是“它取决于”。
事实上,大多数例外应该是特殊的,所以一般来说,我倾向于喜欢它们在应用程序发生时中断。如果异常表示某些可恢复的错误条件,那么当您拥有安全所需的信息时,应该在调用堆栈中的某个位置处理它。这将包括用户可以纠正错误的情况,即捕获异常以将其报告给用户,以便他们可以采取适当的措施。
答案 2 :(得分:0)
如果较低级别的例程知道如何处理异常情况,它应该可以处理它。如果它是与函数要执行的任务无关的异常条件,那么让它在更高级别处理可能更有意义。
答案 3 :(得分:0)
只捕获您可以处理的异常。让其他一切都过去。
答案 4 :(得分:-1)
从Java的角度来看,我总是尝试使用未经检查的异常来避免在方法签名中添加throws声明。
然后我实际捕获异常将取决于具体情况。我总是希望在异常适用的情况下尽可能处理链中的异常。如果它是一个系统级异常,你期望应用程序崩溃,那么我可能会有一个异常处理机制,它将“捕获所有”。