2

我刚刚在 Code Complete 中读到你不应该使用异常来进行流控制。我也知道常见的建议是使用异常来处理“异常情况”。但我不确定如何应用这个建议。使用异常检查构造函数中的无效参数是个好主意吗?例如,我有一个 ExcelInputConverter,它将电子表格中的行转换为 Record 对象(用于操作)。构造函数将 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")
4

2 回答 2

3

如果由于构造函数的参数无效而无法构造对象,则适合使用异常。大多数语言没有提供不同的方法来告诉对象创建者出了问题(除了可能在对象上设置“无效”标志,我不建议这样做)。

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

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

该类处于了解哪些数据对其有效的最佳位置。如果类随着时间的推移而演变并且有效数据的规则发生变化,那么您不希望必须更改使用该类的所有代码来反映这种变化。

于 2012-06-28T18:41:47.537 回答
0

我倾向于使用异常作为最后的手段。对于文件检查之类的东西,我会这样做:(PsuedoCode)

try
{
    fileToCheck = getUserInput();
    while(!fileToCheck.Exists() && quit==false)
    {
        Console.WriteLine("File does not exist. Make sure the path and filename are correct.");
        quit = getQuitInput();
        fileToCheck = getUserInput();
    }
    // fopen(fileToCheck) and other processes. Include other sub-try/catch blocks as needed.
}
catch (Exception e)
{
    Console.WriteLine("Fatal Error Occurred. Check Log files for information.");
    logError(e);
}

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

于 2012-06-28T18:46:47.753 回答