2

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

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

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

当出现此类异常时,将在 Visual Studio 中显示该异常发生在哪一行。这是怎么做的??

希望我的问题很清楚。

4

2 回答 2

1

基本上,当您运行代码时,会逐行执行。当发生异常时,例如除以零,Exception class就会创建一个类型的对象。如果您使用异常处理来捕获异常并且您编写如下内容:

catch (Exception ex)   
{  
    MessageBox.Show(ex.Message);  
}

引发异常的对象引用被复制到ex变量中(在上述情况下),并且您的程序不会终止,如果您正确处理异常,您可以进一步移动。

因此,它基本上是Exception class object在包含有关错误信息的异常生成代码行附近创建的,您可以在 catch 块中复制此引用来处理它。

如果没有异常处理try, catch(),则程序终止并显示技术消息。

看看这个以获得清晰的想法:http: //msdn.microsoft.com/en-us/library/5b2yeyab.aspx

于 2012-08-27T06:43:02.657 回答
1

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

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

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

于 2012-08-27T06:59:37.280 回答