Tim*_*Tim 5 linux operating-system exception
从一本OS的书上,我了解到异常(例如算术溢出,未定义的指令,无效的内存访问)会导致cpu从用户模式切换到内核模式,以便OS可以处理异常
在高级编程语言中,我们可以捕获并处理程序中的默认异常(如上所述)或自定义异常,例如在 C++ 中,通过使用try
andcatch
以及 Java 和 Python 中的类似结构。我注意到在这种情况下,用户程序中会给出异常处理程序。
通过在用户程序中显式捕获和处理异常,
默认异常是否 仍会导致CPU从用户模式切换到内核模式,以便操作系统可以处理异常?
自定义的异常还会 导致cpu从用户态切换到内核态,以便OS能够处理异常吗?
谢谢!(如果需要特定于操作系统,则使用 Linux)
Java 虚拟机规范规定,当抛出异常时,它会寻找合适的异常处理程序:
\n\n\n\n\nJava 虚拟机中的每个方法可能与零个或多个异常处理程序相关联。异常处理程序指定 Java 虚拟机代码中实现异常处理程序处于活动状态的方法的偏移量范围,描述异常处理程序能够处理的异常类型,并指定\n处理该异常的代码的位置。如果导致异常的指令的偏移量在异常处理程序的偏移量范围内,并且异常类型与异常处理程序的类是同一类或其子类,则异常与异常处理程序匹配。异常处理程序处理的异常。当抛出异常时,Java 虚拟机在当前方法中搜索匹配的异常处理程序。如果找到匹配的异常处理程序,系统将分支到匹配的处理程序指定的异常处理代码。
\n
如果没有找到这样的异常处理程序 - 它将突然完成:
\n\n\n\n\n如果方法内执行 Java 虚拟机指令导致 Java 虚拟机抛出异常 ( \xc2\xa72.10 ),并且方法内未处理该异常,则方法调用会突然完成。执行 athrow 指令 ( \xc2\xa7athrow ) 还会导致显式抛出异常,并且如果当前方法未捕获该异常,则会导致方法调用突然完成。突然完成的方法调用永远不会向其调用者返回值。
\n
至于你的问题,当它突然完成时 - 控制权将传递回内核。
\n