用**例外**设计一个班级

时间:2009-10-16 13:53:50

标签: exception class-design naming

当我设计一个类时,我经常无法决定是否应该抛出异常或者在第二个返回错误值时使用2个函数。在2个函数的情况下,我应该如何命名异常和非异常方法?

例如,如果我编写了一个解压缩流的类,并且流有错误或不完整,我会抛出异常。但是,如果应用程序尝试从流中恢复数据并排除错误,该怎么办?它会想要一个返回值吗?那么我应该如何命名第二个函数?

或者我不应该同时拥有异常方法和非异常方法吗?

5 个答案:

答案 0 :(得分:2)

  

或者我不应该同时拥有异常方法和非异常方法吗?

那个。除非您确实时间刻录维护两个独立但大部分相同的方法。

如果你真的需要允许不考虑错误异常的客户端,那么只需用返回值指示它们并完成它...否则,只需编写异常抛出版本并让奇怪的错误 - 吃客户端处理异常。

答案 1 :(得分:2)

这取决于语言,但是......

在我看来,每个可能失败的方法的两个版本对API用户造成过高的认知负担,并且对API维护者造成过高的负担。我的个人偏好是异常,因为记住顺序的参数较少。

答案 2 :(得分:1)

我相信即使您在某些情况下不打算退出程序,也应该尝试使用异常。您只需要为错误创建特定的异常类型。当你需要做一些特定的逻辑时,只捕捉它们。所有其他异常将转到代码的上一级。 例如,您已经创建了在任何错误上抛出异常的函数。如果用户指定了错误的文件名,您不想退出程序。以下是它的外观:

## this is top level try/catch block 
try {
    ## your main code is here
    ...
    ## somewhere deep in your code
    try {
        ## we trying to open file specified by user
    }
    catch (FileNotFoundException) {
        ## we are not going to exit on this error
        ## let's just show a user an error message 
        ## and try to ask different file to open
    }

} catch (Exception) {
    ## catch all exceptions here 
    ## the best thing we can do here is save exception to log and quit }
}

我们只需要创建异常层次结构(如果您的语言允许):

Exception <-- MoreSpecificException

这种方法在Java中使用

答案 3 :(得分:1)

异常通常应用于特殊条件,无论它们是什么。无法解压缩文件可能是一种特殊情况(例如,除非您正在编写程序来扫描严重压缩的文件)。不良数据可能是也可能不是例外。

如果你有一个解压缩流的类,它应该做的是解压缩流,而不是尝试解释它的内容。另一个类应该使用第一个类来获得解压缩输入,并进行解释。这使您可以分离功能和良好的凝聚力。避免让你试图在名字中加上“And”的类:“DecompressAndParseInput”是一个错误的类名。

鉴于两个类,没有特别的理由说明为什么必须使用相同的错误报告 两种方法。解压缩程序可以抛出,解析器可以返回错误代码。

答案 4 :(得分:0)

如果结果不可用,我只会在解压缩功能上抛出异常。如果它们可用,则返回结果,然后读取这些结果的函数可以抛出异常。 IE

try
{
    results = decompress(file); // only throws exceptions on non-usable files
} catch (FileNotFoundException) {
    // file was not usable, can't recover anything, insert nuclear error handling here
}
try
{
    read(results);
} catch (ErrorThatIsRecoverableException) {
    partialRead(results);
}

所以read()是你在普通数据上调用的函数,partialRead是处理试图恢复搞砸但仍然可用的数据的函数。当然,您根本不需要异常或单独的函数 - 您可以在read()函数中进行所有错误处理。