没有类型层次结构的语言可以有异常吗?

Can a language have exceptions without a type hierarchy?

根据我的经验,每种支持异常的语言都有异常类型的层次结构。这允许单个 catch 子句通过捕获它们的共同父项来匹配一组相关的异常。例如Python's hierarchy的一部分:

FloatingPointError < ArithmeticError < Exception < BaseException

另一方面,Go 以不支持异常而著称,并且也有 "no type hierarchy"。有些人认为应该将异常添加到 Go - 是否可以在不添加类型层次结构的情况下做到这一点?

是否有其他语言有例外但没有类型层次结构?他们是否以其他方式对相关异常进行分组?

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

而不是 "myError",你可以抛出任何字符串或数字,所以你可以使用格式化的字符串,比如 "copyFileError,/path/to/source/file.txt,/path/to/dest/file.t‌​xt" case) 然后只比较这个列表中的第一项来判断它是否是你想要处理的错误。

如果您只是使用错误编号而没有任何额外的负载,您可以将数字 space 分段以获得错误 "classes",例如"fatal errors are negative, recoverable ones positive" 或“1-100 是文件系统错误”或其他任何内容(有关使用错误代码范围定义错误 类 的示例,请参阅 HTTP 状态代码)。

我宁愿 post 将此作为评论,但情绪太长,无法在评论的限制范围内传达。我知道这主要是基于意见,对此我深表歉意。

Go 不支持异常,因为它不需要。异常是开发人员被诱使依赖的拐杖,因为他们不想正确处理错误。在 Go 中,惯用的做法是当场处理 every 错误,every 次。如果这样做,您的程序 运行 会更好,并且您会确切地知道 when/where 错误发生并且您可以修复它们。在其他语言中使用 catch 最终会更难调试,因为您并不总是知道错误最初发生的确切位置。通过将您的代码包装在 try catch 块中,您实际上掩盖了代码中的错误。 trycatch 也非常低效,因为二进制中的所有优化都停止了,因为程序必须找出意外发生的事情。在 Go 中正确使用错误可以避免这种情况,因为您可以捕获错误并处理它们,从而 "expecting" 将它们作为偶然事件并正确处理它们。