我正在尝试找到一种在动态类型语言中表达异常的好方法(例如Python,尽管相同的代码可以与静态类型语言中的枚举一起使用)。在我的应用程序中,不会向用户显示异常。哪一个最好? (或者你可以提出更好的建议)
def parseData(data):
length = unpack('!L', data[0:4])
if 4 + len(data) != length:
选项1:
raise Exception("Invalid length")
选项2:
return -1
# Some code later...
parseResult = parseData(data)
if validationResult == -1:
# Do something with the error.
关键是当用户没有看到异常时,是否值得制作自定义异常类型而不是简单路径并返回整数值? (这通常在.indexOf(...)等函数中完成。
答案 0 :(得分:3)
我只能评论Python,但我只会极少raise Exception
,因为它会使错误处理更加困难; except Exception
会抓住许多我更愿意听到的合法错误。
相反,我会从built-in exceptions
中raise
更有意义
raise ValueError("Invalid length.")
Python的大多数内置类和函数raise
都是异常,而不是return
某个标志值。我可以立即想到的唯一例外是str.find
,如果无法找到子字符串return -1
,其合作伙伴str.index
将 {{ 1}};我发现这是可取的,因为raise ValueError
是一个有效的索引。)
可能偶尔出现一个单一函数可能会引发一系列异常的情况,具体取决于究竟发生了什么,但这是不寻常的 - 如果您的响应将取决于出错的地方,则该逻辑可能应该< em> inside 这个函数。您仍然可以坚持使用内置插件,例如:
-1
可以提出def divide(n, lst, index):
return n / lst[index]
,TypeError
或IndexError
,我可以相应地处理:
ZeroDivisionError
如有必要,您甚至可以检查异常中的消息以区分:
try:
divide(1, {3: 4, 5: 6}, 2)
except TypeError:
...
except IndexError:
...
except ZeroDivisionError:
...
except Exception as e:
print("Didn't see that coming: {0}".format(repr(e)))