例外是基本的,还是可以用条件替换?

时间:2013-07-26 16:24:51

标签: exception exception-handling language-agnostic

我试图了解异常情况的来源。我的问题在最后,但我将提供一个可能使其更清晰的例子。


以此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;进入编程?

2 个答案:

答案 0 :(得分:4)

  

如果我们向下移动堆栈,从Java转到操作系统等,是否可以用if-else分支替换所有异常处理代码?

是。这就是以前的工作方式,并且仍然是没有例外的语言。使用例外是因为它们在许多方面都比较容易。主要优点是程序员未预料到的情况可以在通用处理程序中聚合;并且在正确处理之前,不需要在每个函数中明确保留有关异常条件的信息。

  

或者是否存在一些异常(硬件?)的根本原因,这意味着它们被“烘焙”到编程中?

也是的。通常,需要以某种方式处理意外的硬件条件,除非您对这种情况下的未定义行为感到满意。

答案 1 :(得分:0)

如果 all 程序中的方法返回指向某种“异常”对象的指针/引用(对于其他返回值,传入指针或引用调用者分配的存储位置)如果对直接或间接想要抛出异常的每个方法的每次调用都被括起来,例如:

ret = callFunction( ...parameters...);
if (ret != NULL)
  return AddToExceptionStacktrace(ret, ...info about this call site... );

然后就不需要任何其他形式的异常处理(请注意,如果类型支持范围变量,则“return”语句必须插入代码以在实际返回调用方之前清除它们。)< / p>

不幸的是,这是很多额外的代码。这种方法可以在只有 “checked”异常的语言中工作(意味着一个方法既不会抛出异常也不会传递它们,除非它被声明为这样做),但是将这个开销添加到每个函数中可能直接或间接调用抛出异常的函数会非常昂贵。异常处理机制通常会消除无异常情况下99%的额外开销,以及增加“异常”情况下开销的费用。