exception处理是否需要面向对象的编程?
在我的编程经验的这一点上,我意识到我是如何被宠坏的,现在大多数语言(C ++,.Net,Java等)都可以使用exception处理,至less与C相比,我正在准备采取先进的C课程,让我真正思考这些术语与我目前的范式相比。
在C语言中,程序员应该首先防止错误发生,这对任何习惯于exception处理的人来说都是相当艰巨的。 对我来说,我遇到的任何有exception处理的语言都是面向对象的。 至less就我所知,第一个面向exception处理的面向对象语言是C ++,它是C的进化(如果我错了,请纠正我)
那么, 有没有关于一种允许exception处理的语言的面向对象本质的东西,还是作为一个function添加了exception处理,因为面向对象的语言真的开始变得很平常了? 什么是C缺乏说,C ++,在机器代码,使excation工作?
我发现这篇文章是关于exception处理如何在引擎下工作的,但不知道这些信息如何适用于我的问题( 即C是否缺less通知,延续等? )。 提前致谢。
C在机器代码中没有任何东西,exception处理是在setjmp
和longjmp
C中常见的。
在纯程序语言中完全缺乏语言级function的原因是,当不需要调用析构函数时,exception处理与setjmp
相同。 exception处理之前已经在外国语言,但从来没有抓住,因为它是纯粹的语法糖。 然而,一旦析构者进入现场, 堆栈放开成为必要,语言层面的支持变得必要,exception处理作为语言的一部分被广泛实施。
exception处理是否需要面向对象的编程?
不,两者完全分开。 可以将OO语言作为控制stream原语没有exception处理,并且可以使用非OO语言进行exception处理。
正如维基百科指出的,面向对象编程是一种强调抽象 , 封装 , 消息传递 , 模块化 , 多态性和inheritance的价值的编程风格,以实现低成本代码重用和有效pipe理复杂软件由大型团队实施的项目。
您不会在该列表上看到“循环”或“if语句”或“goto”或“try-catch-finally-throw”,因为控制stream原语与抽象,封装,消息传递,模块化,多态性或inheritance被用来实现低成本的代码重用或大型团队对复杂软件项目的有效pipe理。
那C是什么意思,C ++在机器代码中使exception工作?
当然,现代硬件devise时将exception处理作为控制stream原语来devise。 C早在现代硬件出现之前就已经被devise出来了,这使得在C语言中实现exception处理变得更加困难,C语言中的exception处理可以在C上运行的所有硬件上高效运行。
但是这就是说,没有什么能够阻止你或者其他任何人devise一个具有exception处理function的C的新版本作为控制stream原语,而没有C ++的所有其他function。
如果您对如何将exception处理添加到支持延续的非OO语言这一主题感兴趣,请参阅关于这个主题的文章,这些文章勾勒出这个想法:
那么, 有没有关于一种允许exception处理的语言的面向对象本质的东西,还是作为一个function添加了exception处理,因为面向对象的语言真的开始变得普遍?
我在90年代初学习Ada(学习CS)的时候首先了解了一些例外。 IIRC,Ada有一个特殊的Exception
。 那时候,并不是面向对象的语言。 (Ada95增加了一些面向对象的概念。)但是,我同意堆栈展开(即完全自动清理已分配的资源)是exception处理成功的重要特征。 将析构函数与exception处理相结合是C ++中exception成功的重要一点。
我似乎还记得Stroustrup提到Ada作为C ++exception处理的主要影响力。
exception处理是否需要面向对象的编程?
不,这两者是正交的。 其他人提到C中使用的setjmp
和longjmp
来处理错误。 我想提到SEH。
SEH(结构化exception处理)是对C的微软扩展,具有OS级别的支持。 它可以让你编写代码( 例如从MSDN ):
__try { *pResult = dividend / divisor; } __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { // handle exception }
您也可以通过调用RaiseException
来引发自己的exception。 与setjmp
和longjmp
不同,你可以在__finally
块中自己清理。 实际上,C ++exception是在SEH之上实现的(在Windows上)。
这是完全对象非定向处理exception处理的一个例子。
C ++中另一个不使用任何面向对象特性的例子:
try { throw "Boom!"; } catch(const char* str) { printf("Error: %s\n", str); }
实现exception处理的非面向对象的语言包括:
- ITS TECO
- PL / 1(Multics)
- C(正如几个人通过
setjmp
/longjmp
指出的那样) - C通过Unix信号的方式:Unix内核信号是从Multicsexception处理工具中派生出来的
- 旧版本的Lisp(当然,Common Lisp允许OOP,但是在条件和重新启动的时候没有添加)显然实现了ITS TECO的条件和重启(
unwind-protect
) – 根据RMS(http:// www。 gsim.aoyama.ac.jp/~ida/GNU/RMStalk1207.html),意味着Lisp实际上通过Emacs(漂亮!)inheritance了exception处理。
对于一个非必要的例子,试试Haskell的大小。 例外甚至不需要构build到语言中; 它们只是返回types的一部分(例如, Either MyException MyValue
或ExceptionalT IOException IO String
)。 标准exception可以使用Control.Exception
模块的try
函数来处理:
main = do result <- try (evaluate (1 `div` 0)) case result of Left exception -> putStrLn $ "Caught: " ++ show exception Right value -> putStrLn $ "Result: " ++ show value
您也可以使用一个函数作为一个exception处理程序与catch
函数,这里使用中缀:
main = (print $ 1 `div` 0) `catch` \exception -> putStrLn $ "Caught: " ++ show exception
你可以使用Exception monad在另一个monad中执行exception抛出操作。 通过处理所有可能的exception,您可以从Exception monad中转义。
main = do result <- runExceptionalT someFunction case result of Exception exception -> putStrLn ("Caught: " ++ show exception) Success value -> putStrLn ("Result: " ++ show value)
因为exception是函数types签名的一部分,所以必须明确说明。 这与在Java中检查exception本质上是一样的。
在C ++之前,exception处理已经有相当长的时间了。 几个“精品”语言相当早地实现了exception处理,但是Ada(70年代后期,IIRC)可能是最有名的。 Ada有一些OO-ness的闪光,但不是任何现代标准的OO。
exception处理也在几个版本的PL / S语言(绝对不是OO)中实现,这些语言大多在IBM内部使用。 早期的实现(回到70年代后期)是使用macros开发的(PS / Smacros处理器优于大多数),但后来的版本将EHembedded语言中。
非OO语言也有例外,这对于解除调用堆栈是一个有用的抽象。 例子是Erlang和Forth 。
那么,在汇编语言中可以使用陷阱(强制exception)和其他exception来控制程序的stream程。 一个例子是一个空指针或为什么不是stackoverflow。 OO语言的性质没有什么能够启用exception处理。 他们只是使它更容易(和高级语言倾向于抛出更多的例外)。 例外是基本编程的一个关键特性。 由此我不是指所有的编程,我的意思是“常规”编程,包括汇编。 我不明白你的意思是什么,C说缺lessC ++,机器代码使exception工作? 而且我也不会说C程序员完全可以接受这个例外(但是我是这个领域的新手,如果有人能纠正我,请做)。