我想知道...我前段时间读过关于围棋的文章,我试着在里面编些程序.我看起来挺有趣的.但是我已经到了handling "exceptions" in this language岁了.我读过关于他们的方法,这似乎是合理的.我想知道与围棋的风格相比,标准的例外方法有什么优势?好处和坏处是什么?
Edit直截了当地说:我不想就例外进行任何圣战.我只是想知道这种处理错误的方式是否有任何优势?与标准例外相比,这种风格的实际优势是什么?这值得一想吗?
我想知道...我前段时间读过关于围棋的文章,我试着在里面编些程序.我看起来挺有趣的.但是我已经到了handling "exceptions" in this language岁了.我读过关于他们的方法,这似乎是合理的.我想知道与围棋的风格相比,标准的例外方法有什么优势?好处和坏处是什么?
Edit直截了当地说:我不想就例外进行任何圣战.我只是想知道这种处理错误的方式是否有任何优势?与标准例外相比,这种风格的实际优势是什么?这值得一想吗?
panic /恢复在道德上等同于try /捕获异常.有表面的差异(语法)和微妙但重要的预期用途差异.
通常,对异常问题的最佳解释是"Cleaner, more elegant, wrong",这很好地概括了异常与返回错误代码的优缺点.
围棋设计人员认为,通过从函数返回错误代码来处理错误是惯用的围棋方式,并且该语言支持多个返回值以使其在语法上更简单.虽然提供了死机/恢复,但区别不在于功能,而在于预期用途.
其他expose 异常的语言促进了它们的使用,在实践中它们经常被使用(有时甚至被误用).
GO不鼓励使用panic /恢复.你可以这样做,但是你应该只在非常有限的情况下这样做.
如果你看看Go自己的标准库,大多数uses of panic个用于发出致命错误的信号,要么指示库代码中的内部错误(即bug),要么使用错误的数据调用库(例如,将非json数据传递给json解码函数).
但是,正如您所链接的文章所指出的:"Go库中的约定是,即使包在内部使用Panic,其外部API仍然提供显式的错误返回值."
这与C语言、java、python或C++语言不同,其中很多标准库代码都会给信号错误抛出异常.这些语言希望您使用异常.Go不鼓励使用panic /恢复.
总结一下:
在实践中,重要的是使用语言的惯用风格.在围棋中,返回错误代码,避免panic /恢复.在C#中,使用异常来表示一些错误.