当我设计一个类时,我经常无法决定是否应该抛出异常或者在第二个返回错误值时使用2个函数。在2个函数的情况下,我应该如何命名异常和非异常方法?
例如,如果我编写了一个解压缩流的类,并且流有错误或不完整,我会抛出异常。但是,如果应用程序尝试从流中恢复数据并排除错误,该怎么办?它会想要一个返回值吗?那么我应该如何命名第二个函数?
或者我不应该同时拥有异常方法和非异常方法吗?
答案 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()函数中进行所有错误处理。