gpt4 book ai didi

exception - 封装和异常

转载 作者:行者123 更新时间:2023-12-02 02:17:38 25 4
gpt4 key购买 nike

我正在设计我自己的 OO 语言,并且很高兴地进行着,直到遇到异常。在我看来,异常会破坏封装。

比如A类有B类的对象,B类有C类,C类有X,A抛出异常,A中的代码不仅要知道X,还要知道B和C来处理正确。你可以这么说,因为如果你用 D 替换 C,异常的处理程序将不得不更改以从调用堆栈中提取相关信息。

我能想到的解决这个问题的唯一方法是将异常作为类 API 的一部分,以便它们一次向调用堆栈传播一个调用者。他们应该以自己的方式重新中断异常。

这是一个例子。 Trend 是一个分析统计趋势的类,它有一个方法 slope,用于计算两点直线的斜率。

method slope
given
Point 1st
Point 2nd
returns
Number m
except
when infinite slope

m gets
( 2nd's y - 1st's y ) / ( 2nd's x - 1st's x )
except
when any divide by zero
declare infinite slope
when overflow of ( 2nd's y - 1st's y )
declare infinite slope
when overflow of ( 2nd's x - 1st's x )
instead do m gets 0
when overflow of ( 2nd's y - 1st's y ) / ( 2nd's x - 1st's x )
declare infinite slope
when any underflow
instead use 0

end of method slope

有更好的方法吗?

最佳答案

现实世界中的异常大致可以分为以下三个类别之一:

  • 当底层运行时发生 fatal error 时会抛出系统异常,例如内存不足、堆栈溢出或安全违规。这些通常不应该被捕获,而且在许多情况下不能被捕获。他们基本上使用异常系统来(相对)优雅地关闭系统并将最终堆栈跟踪报告给开发人员。

  • 当代码做错事情时会抛出程序异常。诸如无效参数、空指针调用方法、越界错误之类的事情。这些不应该被捕获:相反,导致它们被抛出的代码应该被修复。他们使用异常系统来避免有一个或多或少冗余的断言系统来做大部分相同的事情。

  • 当发生无法通过编程阻止的不良事件时,将抛出运行时异常。当发生意外情况时会抛出它们,但这种情况很少见,您不想用错误代码等弄乱主 API。这些是文件 IO 错误、网络问题、解析错误等。这些异常通常特定于抛出它们的 API。这些是通常应该捕获的唯一种异常。

如果你同意上面的分解,那么封装只影响第三类。对于另外两个,异常没有被代码捕获,所以没关系。对于第三种异常,是的,我认为您通常应该捕获异常并将其转换为适用于重新抛出它的层的不同异常。这就是为什么大多数其他语言的异常系统都支持诸如“InnerException”之类的东西,您可以在其中附加导致当前异常的先前较低级别的异常。

关于exception - 封装和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com