C++ 异常处理是否需要面向对象编程?

C++ 异常处理是否需要面向对象编程?,c++,c,exception-handling,C++,C,Exception Handling,在我编程经验的这一点上,我意识到我现在使用的大多数语言(C++、.Net、Java等)中都有异常处理,至少与C相比,我是多么地被宠坏了。我正准备学习一门高级C课程,并且与我当前的范例相比,我真的在思考这些术语 在C语言中,首先要由程序员来防止错误的发生,这对于任何习惯于异常处理的人来说都是非常可怕的。我突然想到,我遇到的任何有异常处理的语言都是面向对象的。第一个面向对象语言有异常处理,至少在我的知识里,C++是C的进化(如果我错了请纠正我)< /P> 话虽如此,一种语言的面向对象特性是否允许异常

在我编程经验的这一点上,我意识到我现在使用的大多数语言(C++、.Net、Java等)中都有异常处理,至少与C相比,我是多么地被宠坏了。我正准备学习一门高级C课程,并且与我当前的范例相比,我真的在思考这些术语

在C语言中,首先要由程序员来防止错误的发生,这对于任何习惯于异常处理的人来说都是非常可怕的。我突然想到,我遇到的任何有异常处理的语言都是面向对象的。第一个面向对象语言有异常处理,至少在我的知识里,C++是C的进化(如果我错了请纠正我)< /P> 话虽如此,一种语言的面向对象特性是否允许异常处理,或者异常处理是否作为一种功能添加,因为面向对象语言真的开始成为一种普遍现象?C++在机器代码中缺少什么使ExcPoT工作?什么?<强> < /P> 我发现这是关于异常处理如何在引擎盖下工作的,但不确定该信息如何应用于我的问题(即,C是否缺少通知、继续等?)。提前谢谢

话虽如此,一种语言的面向对象特性是否允许异常处理,或者异常处理是否作为一项功能添加,因为面向对象语言真的开始变得很普遍?

我第一次了解例外情况是在90年代初,当时我不得不学习Ada(学习CS)。IIRC,Ada有一个特殊类型
异常
。当时,它不是一种面向对象的语言。(Ada95添加了一些OO概念。)但是,我同意堆栈展开(即完全自动清理分配的资源)是异常处理成功的一个重要特征。将析构函数与异常处理结合起来是C++异常成功的一个重要方面。p>

我也记得StruouTutp提到艾达是C++中异常处理的主要影响。p> 在汇编语言中可以找到异常,您可以使用陷阱(强制异常)和其他异常来控制程序流。例如,空指针或为什么不堆栈溢出。关于支持异常处理的OO语言的本质,没有任何内容。它们只是让它变得更简单(高级语言倾向于抛出更多的异常)。异常是基本编程的一个关键特性。我并不是说所有的编程,我指的是“常规”编程,包括汇编。我不理解你说“C在C++代码中,什么是机器代码,使异常工作的时候”是什么意思?我不会说完全由程序员来捕获C中的异常(但我是这方面的新手。如果有人能纠正我,请纠正)。

C在机器代码中不缺少任何东西,异常处理在C中使用
setjmp
longjmp
非常普遍


纯过程语言中完全缺乏语言级功能的原因是,当不需要调用析构函数时,异常处理与
setjmp
是相同的。异常处理在异国语言中曾经出现过,但从未流行,因为它纯粹是语法上的糖分。但是,一旦析构函数进入场景,栈解卷就变得必要,语言层的支持变得必要,异常处理作为语言的一部分被广泛地实现。

< P>异常处理已经存在了相当长的时间,远远超过C++。一些“精品”语言很早就实现了异常处理,但Ada(70年代后期,IIRC)可能是最有名的。Ada有OO的闪光点,但以任何现代标准来看都不是OO


异常处理也在PL/S语言的几个版本(肯定不是OO)中实现,这些版本主要在IBM内部使用。早期的实现(追溯到70年代后期)是使用宏开发的(PS/S宏处理器优于此后的大多数),但后来的版本将EH嵌入到语言中。

非OO语言也有例外,它是展开调用堆栈的有用抽象。例如,和。

实现异常处理的非面向对象语言包括:

  • 它的TECO
  • PL/1(多学科)
  • C(正如一些人指出的,通过
    setjmp
    /
    longjmp
  • C通过Unix信号:Unix内核信号来自Multics异常处理工具
  • 根据RMS,旧版本的Lisp(已批准,通用Lisp允许OOP,但在添加条件和重新启动时不允许OOP)显然从其TECO实现了条件和重新启动(
    unwind protect
    s)(http://www.gsim.aoyama.ac.jp/~ida/GNU/RMStalk1207.html),这意味着Lisp实际上通过Emacs继承了异常处理(漂亮!)
异常处理是否需要面向对象编程

不,这两个完全不同。可以使用没有异常处理作为控制流原语的OO语言,也可以使用非OO语言进行异常处理

正如维基百科所指出的,面向对象编程是一种编程风格,它强调抽象、封装、消息传递、模块化、多态性的价值,和继承,以实现低成本代码重用和对大型团队实施的复杂软件项目的有效管理

在l上看不到“循环”或“if语句”或“goto”或“try catch finally throw”
__try 
{ 
    *pResult = dividend / divisor; 
} 
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? 
         EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{ 
    // handle exception
}
try {
    throw "Boom!";
} catch(const char* str) {
    printf("Error: %s\n", str);
}
main = do
  result <- try (evaluate (1 `div` 0))
  case result of
    Left  exception -> putStrLn $ "Caught: " ++ show exception
    Right value     -> putStrLn $ "Result: " ++ show value
main = (print $ 1 `div` 0) `catch` \exception ->
  putStrLn $ "Caught: " ++ show exception
main =
   do result <- runExceptionalT someFunction
      case result of
         Exception exception -> putStrLn ("Caught: " ++ show exception)
         Success   value     -> putStrLn ("Result: " ++ show value)