平常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无关。