.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# - 错误设置断点,但仅在调试时在某些行上设置断点

c# - 无法添加对 WinRT C++ DLL 项目的引用

.net - 如何汇总T的多个IEnumerables

c# - 使用 MsBuild 4.0 编译的程序集是否与只有 .NET 3.5 的计算机兼容?

.net - 在运行时更新 WPF 控件

android - 葫芦安卓 : Asset path error when trying to run a test on an APK

java - 如何向 Eclipse 指示我的运行时库在哪里?

c# - .Net CLR 如何在内部实现 "Interface"?

.net - 在 Visual Studio 中处理 VB.NET Linq 格式?

c# - 微软消息队列和资源发布最佳实践