如何抛出运行时异常

时间:2012-08-27 06:20:49

标签: .net runtime clr jit runtimeexception

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

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

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

当出现这样的异常时,它将在visual studio中显示,显示此异常发生在哪一行。怎么做的?

希望我的问题很明确。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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