.net - 运行时异常是如何抛出的

标签 .net runtime clr jit runtimeexception

我开始阅读有关 CLR 的内容,并想知道如何引发运行时异常。

当出现任何语法错误并且我们尝试构建程序时,编译器会检测到它并抛出错误。在这种情况下,编译器不会生成 IL(我假设它不会创建。请澄清)但是当可能出现运行时错误(例如除以零或引用 null)时,编译器无法检测到这一点并生成 IL 。

运行程序时,JIT 使用此 IL 并生成机器代码。现在,当机器代码执行除以零的步骤时,会抛出异常。

当出现这样的异常时,会在Visual Studio中显示出这个异常发生在哪一行。这是怎么做到的??

希望我的问题很清楚。

最佳答案

Visual Studio 创建 PDB 文件,其中包含该指令的机器代码位置和源代码位置之间的映射。

就像我们编写代码来检查某些条件并抛出异常一样,对于运行时异常,条件是由 jit 生成的,在机器语言中它们检查错误并抛出异常。因此,在每次除法运算之前,运行时都会进行零检查,并抛出异常。为了利用具有先进技术的最新 CPU,它们以不同的方式实现和执行,而不是将其作为 IL 中的显式指令。

当出现此类异常时,clr 会映射 PDB 文件中的指令并返回源代码。如果删除 PDB 并从命令行运行,您将看不到任何行号信息。调试器是一个加载 clr 代码和 PDB 并执行所有映射的程序。 Visual Studio 只是获取行号并为您打开文件。有广泛的调试器 API,您可以使用它来获取 Visual Studio 显示的运行时值。

关于.net - 运行时异常是如何抛出的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12137046/

相关文章:

c# - 如何制作只读的 ObservableCollection 属性?

java - 确保通过 Runtime.exec() 运行的程序将与 Java 应用程序一起死亡

c# - 在 C# 中指定泛型类型参数时如何使用 `dynamic`?

c# - 以编程方式加载程序集及其依赖项时的奇怪行为

ios - Visual Studio 中没有 iphone 设备

.net - rabbitmq 的 REST API

vba - vba 代码中的运行时错误

android - AlertDialog 导致 java.lang.RuntimeException : Unable to instantiate activity ComponentInfo

memory-management - WinRT 如何处理 BitmapImage 和 Image 内存

c# - 如何在 App.Config 中设置相对路径?