84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
平常debug出的exception(如图)和人为试图判断用户输入对错的try throw异常有什么本质区别吗? 或者说平常谈及c++的异常机制是不是包括前者, 还是只是单纯的指后者?
上面提到的第一种异常是由什么来判断的, 比如图里的accedd violation, 是编译器进行的判断还是ide的其他工具?
@依云 说的有道理,我做个补充
c++的异常只能捕获由c++抛出的异常。简单来说,即它只能catch它自己(不限于你写的代码,还包括运行库)throw的异常。
实际上c++抛出的异常并不算真正的异常,因为他只是被定义的,可预知的。真正的异常只有执行过后才被cpu触发,即硬件抛出的异常。
硬件不会直接理会c++,它会交给操作系统去处理。鉴于操作系统的不同,对异常的处理也是不一致的————但他们都不会交给上层语言。
以相对完善的windows异常处理为例,它会
交给调试器(进程必须被调试)
执行VEH
执行SEH
TopLevelEH(进程被调试时不会被执行)
交给调试器(上面的异常处理都说处理不了,就再次交给调试器)
调用异常端口通知csrss.exe
内存读取违例,是由硬件判断,然后交由操作系统处理的。(我不太懂 C++,不过这不像是 C++ 的异常,而是 Windows 抛出来的异常。)
没有get到你的点,有些库里就自带的异常类,也可以自定义异常类,最终都继承自std::exception,本质上没啥区别。还有就是这个是运行时的异常,和编译器还有ide无关。
std::exception
@依云 说的有道理,我做个补充
c++的异常只能捕获由c++抛出的异常。简单来说,即它只能catch它自己(不限于你写的代码,还包括运行库)throw的异常。
实际上c++抛出的异常并不算真正的异常,因为他只是被定义的,可预知的。真正的异常只有执行过后才被cpu触发,即硬件抛出的异常。
硬件不会直接理会c++,它会交给操作系统去处理。鉴于操作系统的不同,对异常的处理也是不一致的————但他们都不会交给上层语言。
以相对完善的windows异常处理为例,它会
交给调试器(进程必须被调试)
执行VEH
执行SEH
TopLevelEH(进程被调试时不会被执行)
交给调试器(上面的异常处理都说处理不了,就再次交给调试器)
调用异常端口通知csrss.exe
内存读取违例,是由硬件判断,然后交由操作系统处理的。(我不太懂 C++,不过这不像是 C++ 的异常,而是 Windows 抛出来的异常。)
没有get到你的点,有些库里就自带的异常类,也可以自定义异常类,最终都继承自
std::exception
,本质上没啥区别。还有就是这个是运行时的异常,和编译器还有ide无关。