将异常处理放在构造函数中是一种好习惯吗?

fro*_*die 13 constructor exception-handling

在类构造函数中使用异常处理代码是否合法,还是应该避免?应该避免在构造函数中生成异常代码吗?

jas*_*son 9

是的,这是完全合理的.你怎么会有这样的情况:

class List {
    public List(int length) {
        if(length < 0) {
            throw new ArgumentOutOfRangeException(
                "length",
                "length can not be negative"
            );
        }
        // okay, go!
    }
}
Run Code Online (Sandbox Code Playgroud)

List具有负长度的A 当然是特殊的.你不能让这回到调用者那里让他们认为构建是成功的.有什么替代方案,CheckIfConstructionSucceeded实例成员函数?令人讨厌.

或者怎么样

class FileParser {
    public FileParser(string path) {
        if(!File.Exists(path)) {
            throw new FileNotFoundException(path);
        }
        // okay, go!
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,这是一个抛出,没有别的可以接受.

  • @froadie:没办法. (3认同)
  • @froadie:这取决于语言,但最流行的OOP语言(C++,C#和Java)中有一些非常强大的共同原则.我建议阅读Herb Sutter的"C++,C#和Java中的构造函数异常"(http://bit.ly/9XoTQ0). (2认同)

Eli*_*sky 5

假设您正在谈论的是 C++,引发异常实际上是在构造函数中发出错误信号的唯一方法 - 所以这绝对不应该避免 (*)

至于在构造函数内处理异常,这也是完全有效的,前提是您实际上可以处理异常。只需遵循这里的通用规则:在您可以处理异常的级别捕获异常/对它们做一些有意义的事情。

(*) 只要您不属于避免 C++ 异常的邪教