Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何引发运行时异常_.net_Runtime_Clr_Jit_Runtimeexception - Fatal编程技术网

.net 如何引发运行时异常

.net 如何引发运行时异常,.net,runtime,clr,jit,runtimeexception,.net,Runtime,Clr,Jit,Runtimeexception,我开始阅读关于CLR的文章,想知道运行时异常是如何抛出的 当出现语法错误时,如果我们试图构建程序,编译器会检测到它并抛出错误。在这种情况下,IL不会由编译器生成(我假设它不会创建。请澄清),但当存在运行时错误的可能性时(例如被零除或引用null),编译器无法检测到这一点并生成IL 在运行程序时,JIT使用此IL并生成机器代码。现在,当机器代码执行除法为零的步骤时,抛出一个异常 当出现此类异常时,它将显示在visual studio中,显示发生此异常的行。这是怎么做到的 希望我的问题清楚 基本上,

我开始阅读关于CLR的文章,想知道运行时异常是如何抛出的

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

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

当出现此类异常时,它将显示在visual studio中,显示发生此异常的行。这是怎么做到的


希望我的问题清楚

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

catch (Exception ex)   
{  
    MessageBox.Show(ex.Message);  
}
引发的异常的对象引用被复制到
ex
变量(在上述情况下)并 您的程序不会终止,只要正确处理异常,您可以进一步移动

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

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


请看下面的内容以了解清楚的想法:

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

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

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