Exception 设计包含**异常的类**

Exception 设计包含**异常的类**,exception,class-design,naming,Exception,Class Design,Naming,当我设计一个类时,我常常很难决定是抛出一个异常还是让第二个func返回一个err值。对于2个函数,我应该如何命名exception和non-exception方法 例如,如果我编写了一个类来解压缩一个流,而该流有错误或不完整,我会抛出一个异常。但是,如果应用程序试图从流中恢复数据,但出现错误,该怎么办?它会想要一个返回值吗?那么我应该如何命名第二个函数呢 或者我不应该同时拥有异常方法和非异常方法吗 或者我不应该同时拥有异常方法和非异常方法吗 那就好了。除非你真的有时间花在维护两种不同但基本相同的

当我设计一个类时,我常常很难决定是抛出一个异常还是让第二个func返回一个err值。对于2个函数,我应该如何命名exception和non-exception方法

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

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

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

那就好了。除非你真的有时间花在维护两种不同但基本相同的方法上

如果您确实需要允许不考虑异常的客户,那么只需用返回值来指示它们,并用它来完成…否则,只需编写异常引发版本,并让奇数错误处理客户端处理异常

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

那就好了。除非你真的有时间花在维护两种不同但基本相同的方法上


如果您确实需要允许不考虑异常的客户,那么只需用返回值来指示它们,并用它来完成…否则,只需编写异常抛出版本,并让奇数错误读取客户端处理异常。

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

## 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 }
}
我们只需要创建异常的层次结构(如果您的语言允许):


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

## 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 }
}
我们只需要创建异常的层次结构(如果您的语言允许):


异常它取决于语言,但是


在我看来,每个可能失败的方法的两个版本对API用户造成了太高的认知负担,对API维护者造成了太高的负担。我个人的偏好是例外,因为要记住的参数数量较少。

这取决于语言,但是


在我看来,每个可能失败的方法的两个版本对API用户造成了太高的认知负担,对API维护者造成了太高的负担。我个人更喜欢异常,因为要记住顺序的参数更少。

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

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()函数中执行所有错误处理。

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

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()函数中完成所有错误处理。

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

如果有一个类正在解压流,那么它应该做的是解压流,而不是试图解释它的内容。另一个类应该使用第一个类来获取解压缩的输入,并进行解释。这使您能够分离功能和良好的内聚性。避免在名称中添加“And”的类:“DecompressAndParseInput”是一个错误的类名

给定两个类,没有特别的原因说明为什么必须使用相同的错误报告
方法对两者都适用。解压器可能会抛出错误代码,解析器可能会返回错误代码。

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

如果有一个类正在解压流,那么它应该做的是解压流,而不是试图解释它的内容。另一个类应该使用第一个类来获取解压缩的输入,并进行解释。这使您能够分离功能和良好的内聚性。避免在名称中添加“And”的类:“DecompressAndParseInput”是一个错误的类名

有两门课,就有