Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception handling 将异常处理放在构造函数中是一种好的做法吗?_Exception Handling_Constructor - Fatal编程技术网

Exception handling 将异常处理放在构造函数中是一种好的做法吗?

Exception handling 将异常处理放在构造函数中是一种好的做法吗?,exception-handling,constructor,Exception Handling,Constructor,在类构造函数中有异常处理代码是合法的,还是应该避免?如果在构造函数中避免异常生成代码?假定它是C++,那么提高异常实际上是唯一的方法来在构造函数中发出错误信号,所以这绝对不应该被避免(*) 至于在构造函数内部处理异常,这也是完全有效的,假设您实际上可以处理异常。只需遵循这里的通用规则:在您可以处理异常的级别捕获异常/对其做一些有意义的事情 (*)只要你不属于邪教 这避免了C语言中的异常++ 在C++中,CtoS最好放置异常备份。 是的,这是完全合理的。否则你怎么会遇到这样的情况: class L

在类构造函数中有异常处理代码是合法的,还是应该避免?如果在构造函数中避免异常生成代码?

假定它是C++,那么提高异常实际上是唯一的方法来在构造函数中发出错误信号,所以这绝对不应该被避免(*)

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

(*)只要你不属于邪教 这避免了C语言中的异常++


在C++中,CtoS最好放置异常备份。 是的,这是完全合理的。否则你怎么会遇到这样的情况:

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

同样,这是一个抛出,其他任何东西都不可接受。

我认为在构造函数中抛出异常以停止对象的创建是有效的。

一般来说,我认为在构造函数中应尽可能避免生成异常代码。但是,这是非常特定于语言的-在某些语言中,构造函数抛出异常会导致无法恢复的问题,但在某些其他语言中,这是可以的


就个人而言,我试图让我的构造函数尽可能少地将对象置于有效状态。一般来说,这意味着他们不会抛出异常,除非这是一个真正的异常情况(我无论如何都无法处理)。

只要有可能抛出异常,“最佳实践”就是处理它、构造函数或其他


它确实给构造函数增加了另一层复杂性,因为即使出现错误,您也必须确保所有内容都正确初始化,但这比使用错误代码要好:)

当然,请尽早失败!在构造函数内部,输入参数的某些验证可能出错,因此绝对值得失败,而不是继续处理不一致的构建数据


Constructor(Param param){
  if(param == null)
    throw new IllegalArgumentException(...);
}

语言?(这里有点重要…)我的意思是作为一个一般的独立于语言的问题。。。只是一般的OOP标准。是的,但不幸的是,在这种情况下,语言的选择对除一般准则以外的所有内容都有影响。该代码不应该在属性的(长度)setter方法中吗?如果长度永远不能为负,那么如果构造函数不允许它为负,我认为应该有一个setLength()setter方法来强制执行有效的长度。在构造函数中处理它的原因是什么?(我是不是遗漏了什么?@froadie:是的,你遗漏了什么。我正在定义一个
列表
,它有一个构造函数,允许我指定初始长度(如果我知道要插入多少项,并且性能非常关键,因此我不想担心动态重增长,那么这很有用)。构造函数必须检查参数
length
是否是对象状态的有效输入。如果你想把它重构成另一个可以与属性设置程序共享的方法,那就这样做吧。我明白你的意思。谢谢你的编辑。我从未实现过可以阻止构造的构造函数-如果构造函数失败(如您的示例中,由于抛出的异常),对象/对象引用的状态是什么?@froadie:这取决于语言,但在最流行的OOP语言(C++、C#和Java)中有一些非常强的通用原则。我建议阅读Habor萨特的“C++中的构造函数异常、C语言和java”()。当然,如果可能的话,应该避免使用。这是一个几乎微不足道的声明。可能有效的方法是如果对象构造可以继续。如果由于任何原因对象构造无法继续,则应引发异常。我同意你的第二段。@Jason:从技术上讲,我认为这有点苛刻。这不是一个简单的语句,因为通常可以做出设计决策,以避免在构造函数中引发异常。由开发人员决定哪些内容进入构造函数,哪些内容作为参数传递给实际工作的方法等等。因此,基本上,您认为构造函数应该只做尽可能少的工作,构造函数中的异常处理代码应该很少?@froadie:是的。我个人认为,构造器应该尽可能使对象不处于无效状态,至少在可能/实际的情况下。

Constructor(Param param){
  if(param == null)
    throw new IllegalArgumentException(...);
}