Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Oop 我应该使用异常检查构造函数中的无效参数吗?_Oop_Exception_Exception Handling - Fatal编程技术网

Oop 我应该使用异常检查构造函数中的无效参数吗?

Oop 我应该使用异常检查构造函数中的无效参数吗?,oop,exception,exception-handling,Oop,Exception,Exception Handling,我刚刚阅读了完整的代码,您不应该将异常用于流控制。我也知道常用的建议是使用异常来处理“异常情况”。但我不知道如何应用这个建议。使用异常检查构造函数中的无效参数是一个好主意吗?例如,我有一个ExcelInputConverter,它将电子表格中的行转换为记录对象(用于操作)。构造函数将excel文件的名称作为输入。我是否应该使用异常来检查传入的字符串是否为有效的excel文件?excel文件是否存在?我似乎应该在这里使用异常,因为如果发生这种情况,类基本上无法运行 检查类内或类外的无效数据是一个好

我刚刚阅读了完整的代码,您不应该将异常用于流控制。我也知道常用的建议是使用异常来处理“异常情况”。但我不知道如何应用这个建议。使用异常检查构造函数中的无效参数是一个好主意吗?例如,我有一个ExcelInputConverter,它将电子表格中的行转换为记录对象(用于操作)。构造函数将excel文件的名称作为输入。我是否应该使用异常来检查传入的字符串是否为有效的excel文件?excel文件是否存在?我似乎应该在这里使用异常,因为如果发生这种情况,类基本上无法运行

检查类内或类外的无效数据是一个好主意吗

Public Sub New(filename as string) 'new excel input converter
      If Not (Path.GetExtension(fileName) = ".xls" Or Path.GetExtension(fileName) = ".xlsx") Then Throw New Exception("Can't make an Excel input converter from a non-Excel file like " & inputFileName)
      If Not (File.Exists(fileName)) Then Throw New Exception("This file does not exist. Can't make an Excel converter")

如果由于构造函数的参数无效而无法构造对象,则应执行异常。大多数语言都没有提供一种不同的方法来告诉对象创建者出了什么问题(除了在对象上设置一个“无效”标志,我不建议这样做)

.NET为这种情况定义了一个

检查类内或类外的无效数据是一个好主意吗

Public Sub New(filename as string) 'new excel input converter
      If Not (Path.GetExtension(fileName) = ".xls" Or Path.GetExtension(fileName) = ".xlsx") Then Throw New Exception("Can't make an Excel input converter from a non-Excel file like " & inputFileName)
      If Not (File.Exists(fileName)) Then Throw New Exception("This file does not exist. Can't make an Excel converter")

该类最有可能知道哪些数据对其有效。如果该类随着时间的推移而发展,并且有效数据的规则也发生了变化,那么您就不必更改使用该类来反映该变化的所有代码。

我倾向于使用异常作为最后手段。对于类似文件检查的内容,我会: (伪代码)


通过这种方式,用户可以尝试修复他们自己可能出现的用户错误问题,并且只有在他们无法修复的更复杂的情况下(excel文件损坏或发生其他情况),程序才会终止

实际上没有任何其他方法可以告诉程序构造函数失败,因此使用异常是正确的,方法。这并不能真正解决OP的问题,即它们是否适用于构造函数……我通常在我的代码中使用这个概念,因此如果从输入值创建构造函数,它将尝试在传递给构造函数之前验证参数。如果任何用户输入验证需要在构造函数中进行,并且不能在UI范围内完成,那么重新向用户请求数据(例如,创建1000个输入错误的对象)是不可行的,因此异常情况会更好