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处理是在setjmplongjmp 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语言这一主题感兴趣,请参阅关于这个主题的文章,这些文章勾勒出这个想法:

http://blogs.msdn.com/b/ericlippert/archive/2010/10/22/continuation-passing-style-revisited-part-two-handwaving-about-control-flow.aspx

那么, 有没有关于一种允许exception处理的语言的面向对象本质的东西,还是作为一个function添加了exception处理,因为面向对象的语言真的开始变得普遍?

我在90年代初学习Ada(学习CS)的时候首先了解了一些例外。 IIRC,Ada有一个特殊的Exception 。 那时候,并不是面向对象的语言。 (Ada95增加了一些面向对象的概念。)但是,我同意堆栈展开(即完全自动清理已分配的资源)是exception处理成功的重要特征。 将析构函数与exception处理相结合是C ++中exception成功的重要一点。

我似乎还记得Stroustrup提到Ada作为C ++exception处理的主要影响力。

exception处理是否需要面向对象的编程?

不,这两者是正交的。 其他人提到C中使用的setjmplongjmp来处理错误。 我想提到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。 与setjmplongjmp不同,你可以在__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 MyValueExceptionalT 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程序员完全可以接受这个例外(但是我是这个领域的新手,如果有人能纠正我,请做)。