C++ 异常处理是否需要面向对象编程?
在我编程经验的这一点上,我意识到我现在使用的大多数语言(C++、.Net、Java等)中都有异常处理,至少与C相比,我是多么地被宠坏了。我正准备学习一门高级C课程,并且与我当前的范例相比,我真的在思考这些术语 在C语言中,首先要由程序员来防止错误的发生,这对于任何习惯于异常处理的人来说都是非常可怕的。我突然想到,我遇到的任何有异常处理的语言都是面向对象的。第一个面向对象语言有异常处理,至少在我的知识里,C++是C的进化(如果我错了请纠正我)< /P> 话虽如此,一种语言的面向对象特性是否允许异常处理,或者异常处理是否作为一种功能添加,因为面向对象语言真的开始成为一种普遍现象?C++在机器代码中缺少什么使ExcPoT工作?什么?<强> < /P> 我发现这是关于异常处理如何在引擎盖下工作的,但不确定该信息如何应用于我的问题(即,C是否缺少通知、继续等?)。提前谢谢 话虽如此,一种语言的面向对象特性是否允许异常处理,或者异常处理是否作为一项功能添加,因为面向对象语言真的开始变得很普遍? 我第一次了解例外情况是在90年代初,当时我不得不学习Ada(学习CS)。IIRC,Ada有一个特殊类型C++ 异常处理是否需要面向对象编程?,c++,c,exception-handling,C++,C,Exception Handling,在我编程经验的这一点上,我意识到我现在使用的大多数语言(C++、.Net、Java等)中都有异常处理,至少与C相比,我是多么地被宠坏了。我正准备学习一门高级C课程,并且与我当前的范例相比,我真的在思考这些术语 在C语言中,首先要由程序员来防止错误的发生,这对于任何习惯于异常处理的人来说都是非常可怕的。我突然想到,我遇到的任何有异常处理的语言都是面向对象的。第一个面向对象语言有异常处理,至少在我的知识里,C++是C的进化(如果我错了请纠正我)< /P> 话虽如此,一种语言的面向对象特性是否允许异常
异常
。当时,它不是一种面向对象的语言。(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实现了条件和重新启动(
s)(http://www.gsim.aoyama.ac.jp/~ida/GNU/RMStalk1207.html),这意味着Lisp实际上通过Emacs继承了异常处理(漂亮!)unwind protect
__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)