根据我的经验,支持异常的每种语言都有异常类型的层次结构。这允许单个catch
子句通过捕获其共同父代来匹配一组相关异常。例如,Python's hierarchy的一部分:
FloatingPointError < ArithmeticError < Exception < BaseException
另一方面,Go,着名的不支持异常,并且"no type hierarchy"。有些人认为应该在Go中添加例外 - 是否可以在不添加类型层次结构的情况下执行此操作?
是否有其他语言有异常但没有类型层次结构?他们是否以其他方式对相关的例外进行分组?
答案 0 :(得分:2)
SuperTalk实际上没有数据类型,但有例外。基本上你抛出一个错误代码并检查。这也是早期的macOS应用程序框架有多少工作,即使在C ++中也是如此。
因此,正如可以通过使用带有类型选择器的简单数据结构来近似对象,可以使异常起作用。
on doFoo
throw "myError"
end doFoo
on startUp
try
doFoo
catch tError
if tError = "myError" then
-- do something about it
else
throw tError
end if
end try
end startUp
而不是&#34; myError&#34;,您可以抛出任何字符串或数字,因此您可以使用格式化字符串,例如&#34; copyFileError,/ path / to / source / file.txt,/ path /to/dest/file.t XT&#34; (当然正确地逃避危险字符,例如&#34;,&#34;在这种情况下)然后只需比较此列表中的第一项,以判断它是否是您想要处理的错误。
如果您只是使用错误编号而没有任何额外的有效负载,则可以对数字空间进行分段以获得错误&#34;类&#34;例如&#34;致命错误是消极的,可恢复的错误是正面的&#34;或&#34; 1-100是文件系统错误&#34;或者其他(请参阅HTTP状态代码以获取使用错误代码范围来定义错误类的示例)。
答案 1 :(得分:2)
我宁愿将此作为评论发布,但是在评论的限制范围内,这种情绪太长了。我知道这主要是基于意见的,我为此道歉。
Go不支持异常,因为它不需要。例外情况是开发人员被诱惑变得依赖的拐点,因为他们不想正确处理错误。在Go中,现场处理每个错误,每时间是惯用的。如果你这样做,你的程序运行得更好,你知道错误发生的确切时间/地点,你可以修复它们。在其他语言中使用catch
最终会更难以调试,因为您并不总是知道错误最初发生的确切位置。通过将代码包装在try
catch
块中,您实际上可以屏蔽代码中的错误。 try
和catch
也非常低效,因为二进制文件中的所有优化都会停止,因为程序必须弄清楚意外发生了什么。在Go中正确使用错误可以避免这种情况,因为您捕获错误并处理它们,从而预期&#34;它们是一种可能性并正确处理它们。