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

Oop 没有类型层次结构的语言可以有异常吗?,oop,exception,inheritance,programming-languages,Oop,Exception,Inheritance,Programming Languages,根据我的经验,每种支持异常的语言都有一个异常类型的层次结构。这允许单个catch子句通过捕获一组相关异常的公共父异常来匹配这些异常。例如,部分: FloatingPointError

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

FloatingPointError
另一方面,众所周知,Go不支持异常,也有。有些人认为应该将异常添加到Go中——不添加类型层次结构是否可以做到这一点


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

SuperTalk实际上没有数据类型,但有异常。基本上你会抛出一个错误代码并检查它。这也是早期MaOS应用程序框架的工作方式,即使是在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“(当然,在本例中,要正确转义危险字符,如“,”),然后只需比较此列表中的第一项,就可以判断这是否是您要处理的错误


如果您只是在没有任何额外负载的情况下使用错误号,则可以对数字空间进行分段以获得错误“类”,例如“致命错误为负,可恢复错误为正”或“1-100为文件系统错误”或其他任何内容(有关使用错误代码范围定义错误类的示例,请参阅HTTP状态代码).

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


Go不支持异常,因为它不需要。异常是一种诱使开发人员依赖的拐杖,因为他们不想正确地处理错误。在围棋中,处理每一个错误是惯用的方法,每次都要当场处理。如果您这样做,您的程序会运行得更好,您可以准确地知道错误发生的时间/地点,并可以修复它们。在其他语言中使用
catch
会导致调试更加困难,因为您并不总是知道错误最初发生的确切位置。通过将代码包装在
try
catch
块中,基本上可以掩盖代码中的错误
try
catch
也非常低效,因为二进制文件中的所有优化都停止了,因为程序必须找出意外发生的情况。在Go中正确地使用错误可以避免这种情况,因为您可以捕获错误并处理它们,从而“预期”它们成为可能并正确地处理它们。

在C#中,几乎所有异常都是“直接”从
系统派生的。异常
;这就是你的意思吗?拥有一个异常层次结构与一开始就有异常没有任何关系。与您的示例相关,Python的原始异常都是字符串。@JimB-很好的示例。我在Python中找到了一些关于字符串与类异常的信息。C#的异常层次结构可能比Python的要浅,但该层次结构仍然存在。例如,与Python中的
FloatingPointError
类似,C#拥有
ArgumentNullException
。经过几个月的大部分Go,我第一次编写了一些Python,我发现Go极大地改变了我的Python风格,也让我欣赏Go对多返回语句的惯用用法。在try-catch块中包装每个抛出异常的调用非常冗长。去吧,让我养成处理每一个失败的习惯,然后把它翻译成我的Python,但这并不是很好。此外,在一个通用的try-catch中包装大量的Java块也是很常见的,这让我抓狂。如果您做了一些事情,抛出异常以在其他地方处理它,那么问题就开始了。来自Java,我发现Go的“错误是一流的成员,处理它们”真的让人大开眼界。恐慌提供了足够的灵活性。@Dale的同事在Java中也曾这样对我。。。主要是因为我的厌恶。Go改变了我现在用每种语言编写代码的方式。主要是为了更好。有趣-是否有示例代码在SuperTalk中演示异常处理?我添加了一个示例,我在web上找不到好的示例,无论是在任何与SuperCard相关的论坛上,还是在后续语言LiveCode的论坛上。这与标准异常处理没有什么区别,事实上,如果你想,你也可以在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