显式捕获和处理异常是否会导致切换到内核模式?

Tim*_*Tim 5 linux operating-system exception

从一本OS的书上,我了解到异常(例如算术溢出,未定义的指令,无效的内存访问)会导致cpu从用户模式切换到内核模式,以便OS可以处理异常

在高级编程语言中,我们可以捕获并处理程序中的默认异常(如上所述)或自定义异常,例如在 C++ 中,通过使用tryandcatch以及 Java 和 Python 中的类似结构。我注意到在这种情况下,用户程序中会给出异常处理程序。

通过在用户程序中显式捕获和处理异常,

  • 默认异常是否 仍会导致CPU从用户模式切换到内核模式,以便操作系统可以处理异常?

  • 自定义的异常还会 导致cpu从用户态切换到内核态,以便OS能够处理异常吗?

谢谢!(如果需要特定于操作系统,则使用 Linux)

alf*_*sin 1

Java 虚拟机规范规定,当抛出异常时,它会寻找合适的异常处理程序:

\n\n
\n

Java 虚拟机中的每个方法可能与零个或多个异常处理程序相关联。异常处理程序指定 Java 虚拟机代码中实现异常处理程序处于活动状态的方法的偏移量范围,描述异常处理程序能够处理的异常类型,并指定\n处理该异常的代码的位置。如果导致异常的指令的偏移量在异常处理程序的偏移量范围内,并且异常类型与异常处理程序的类是同一类或其子类,则异常与异常处理程序匹配。异常处理程序处理的异常。当抛出异常时,Java 虚拟机在当前方法中搜索匹配的异常处理程序。如果找到匹配的异常处理程序,系统将分支到匹配的处理程序指定的异常处理代码。

\n
\n\n

如果没有找到这样的异常处理程序 - 它将突然完成

\n\n
\n

如果方法内执行 Java 虚拟机指令导致 Java 虚拟机抛出异常 ( \xc2\xa72.10 ),并且方法内未处理该异常,则方法调用会突然完成。执行 athrow 指令 ( \xc2\xa7athrow ) 还会导致显式抛出异常,并且如果当前方法未捕获该异常,则会导致方法调用突然完成。突然完成的方法调用永远不会向其调用者返回值。

\n
\n\n

至于你的问题,当它突然完成时 - 控制权将传递回内核。

\n