为什么许多语言将异常对象视为一等公民?

als*_*net 2 oop exception

当我们得到一个实际上是异常的对象时,我们可以用它们做我们可以用我们语言中的普通对象做的任何事情.我们可以将它们作为参数传递,我们可以将它们存储在一些集合中,最糟糕的是,我们可以从方法中返回它们!

所以有人可能会写这样的臭代码:

public Exception doSomethingCritical()
{
    Exception error = null;

    try
    {
        ...
    }
    catch (Exception e)
    {
        // maybe at least here is the logging of the error if we are lucky
        error = e;
    }
    return error;
}
Run Code Online (Sandbox Code Playgroud)

所以问题是为什么Exception-object的概念是许多OO语言中的一等公民?也许如果我们在异常对象(如throw)允许的语言中只有有限的结构,那就更好了.

Rya*_*ner 6

将异常视为一种特殊情况并且仅允许有限的异常功能的问题在于,最终某个好程序需要对异常执行某些操作,无论是全局错误处理程序还是适当处理异常的有限项.通过制定例外的一等公民,有许多好处,例如:

  • 允许子类化异常.这对于异常处理非常有用,因为处理异常的代码可以缩小范围,只处理他们知道如何处理的异常.我甚至可以说任何只捕获"异常"的非全局异常处理例程可能都是错误的.
  • 传递数据和异常.如果您在catch逻辑中知道的唯一事情是发生异常,则异常不是很有用.堆栈跟踪,消息甚至是某些异常类型的自定义数据对于识别和解决导致异常的问题非常有用.
  • 创建自己使用OOP的错误处理例程.如果异常不能作为对象传递,那么你就不能拥有一个处理异常的库 - 好吧,至少不是一个写得很好的库.

除此之外,没有办法防范上面发布的错误异常处理.即使一个例外不是头等公民,也没有办法阻止开发人员吃任何和所有例外并继续他们的快乐方式(至少,没有从根本上打破我们对异常的看法)