fro*_*die 13 constructor exception-handling
在类构造函数中使用异常处理代码是否合法,还是应该避免?应该避免在构造函数中生成异常代码吗?
是的,这是完全合理的.你怎么会有这样的情况:
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)
同样,这是一个抛出,没有别的可以接受.
假设您正在谈论的是 C++,引发异常实际上是在构造函数中发出错误信号的唯一方法 - 所以这绝对不应该避免 (*)
至于在构造函数内处理异常,这也是完全有效的,前提是您实际上可以处理异常。只需遵循这里的通用规则:在您可以处理异常的级别捕获异常/对它们做一些有意义的事情。
(*) 只要您不属于避免 C++ 异常的邪教