我试图了解异常情况的来源。我的问题在最后,但我将提供一个可能使其更清晰的例子。
以此Java代码为例。它具有文件路径并设置File
对象。如果路径为null,则抛出异常。
String path = getPathName();
try {
File file = new File(path);
} catch (NullPointerException e) {
// ...
}
但这并不是一个例外情况,如果我们能以这样的方式对其进行修改,那么这可能是可取的:
String path = getPathName();
if (path == null) {
path = DEFAULT_PATH;
}
File file = new File(path); # we've removed the need for an exception
但进一步说,当我们尝试使File
可读时,我们会遇到一个新的异常。
try {
file.setReadable(true);
} catch (SecurityException e) {
// ...
}
我们可以通过检查两个条件来解决这个问题:
SecurityManager sm = System.getSecurityManager();
if (sm != null && sm.checkWrite(path)) {
// modify the SecurityManager
} else {
file.setReadable(true);
}
记住这个例子,关于我的问题......
如果我们向下移动堆栈,从Java转到操作系统等,是否可以用if-else分支替换所有异常处理代码?或者是否存在一些例外(硬件?)的根本原因,这意味着它们已被“烘焙”#34;进入编程?
答案 0 :(得分:4)
如果我们向下移动堆栈,从Java转到操作系统等,是否可以用if-else分支替换所有异常处理代码?
是。这就是以前的工作方式,并且仍然是没有例外的语言。使用例外是因为它们在许多方面都比较容易。主要优点是程序员未预料到的情况可以在通用处理程序中聚合;并且在正确处理之前,不需要在每个函数中明确保留有关异常条件的信息。
或者是否存在一些异常(硬件?)的根本原因,这意味着它们被“烘焙”到编程中?
也是的。通常,需要以某种方式处理意外的硬件条件,除非您对这种情况下的未定义行为感到满意。
答案 1 :(得分:0)
如果 all 程序中的方法返回指向某种“异常”对象的指针/引用(对于其他返回值,传入指针或引用调用者分配的存储位置)如果对直接或间接想要抛出异常的每个方法的每次调用都被括起来,例如:
ret = callFunction( ...parameters...);
if (ret != NULL)
return AddToExceptionStacktrace(ret, ...info about this call site... );
然后就不需要任何其他形式的异常处理(请注意,如果类型支持范围变量,则“return”语句必须插入代码以在实际返回调用方之前清除它们。)< / p>
不幸的是,这是很多额外的代码。这种方法可以在只有