CLR Debugger - 在程序抛出异常的时候中断程序的执行
来源:互联网 发布:淘宝电脑配件能买么 编辑:程序博客网 时间:2024/06/07 04:09
1.1.1. 在程序抛出异常的时候中断程序的执行
.NET对异常的良好支持,让我们摆脱了以前在C和C++程序开发过程中,那种不停的检查返回值的编程模式,使我们的程序变的更为简洁。异常不仅方便我们更高效的编写代码,同时也提供了一个好用的调试技巧—当然需要调试器的良好支持。在程序开发的过程中,可能会经常碰到这种情况,程序在运行很长时间后,突然抛出一个异常以后,就中断执行了。这种错误(Bug)在平常执行时,一般很难重现,除了异常里面的堆栈信息以外,你几乎没有任何其他信息让你知道程序内部到底发生了什么。这是你就可以使用CLR Debugger里面的异常断点。
在CLR Debugger里面,点击菜单栏里的“Debug”菜单里的“Exceptions…”菜单项,打开“Exceptions…”对话框设置异常断点:
图 1-6 CLR Debugger异常断点设置对话框
在“Exceptions”对话框里面,勾上相应异常类型名旁边的复选框就可以设置,在这些异常抛出的时候,“Break when an exception is”列表中有两列复选框:“Thrown”和“User-unhandled”列,这两列的区别是:
l 当“User-unhandled”一列的复选框被选中以后,调试器只在程序中抛出指定的异常以后,并且程序中没有捕捉这个异常,调试器才中断程序的执行。而程序中有try…catch块捕捉该异常时,调试器会让程序继续执行,并忽略这个异常。
l 当“Thrown”一列的复选框被选中以后,则无论程序是否有try…catch块捕捉该异常,只要扔出了指定的异常,则调试器都会中断程序的执行。
小技巧:
选择命名空间旁边的复选框,会将该命名空间中定义的所有异常选中。
“Exceptions”对话框中只列出了CLR当中定义的异常,如果你希望调试器在自定义的异常被抛出的时候,也能中断程序的执行,则你可以在“Exceptions”对话框中将自定义异常添加进来。点击“Add”按钮添加自定义异常,注意,你必须提供自定义异常的完整类名—即命名空间加上类名。下面的示例代码演示了这一过程:
using System;
using System.IO;
namespace TestNamespace
{
public class TestException :Exception
{
}
public class ExceptionBreakpoint
{
static void Main()
{
// 在“New Exception”中添加TestNamespace.TestException异常
// 并且在“Throw”中勾上“TestNamespace.TestException”复选框
// 下面的语句才会导致程序中断,并且跳入到调试器当中
try
{
for (int i = 0; i < 10; ++i)
{
if (i == 5)
throw new TestException();
Console.WriteLine(i);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
// 无论“Exception”对话框中的“Throw”或“User-unhandled”是否
// 被选中,下面的语句总能导致程序中断,并且跳入到调试器中
using (StreamReader reader =new StreamReader(
"notexists.txt"))
Console.WriteLine(reader.ReadToEnd());
}
}
}
表 1-2异常断点的演示代码
在上面的例子当中,细心的读者会发现,当调试器捕获在try…catch块中抛出的异常时,高亮显示的当前代码并不是包含throw语句的那一行,而是throw下面的一行,而捕捉到using语句那一行抛出的异常后,高亮显示的当前代码行正是扔出异常的那一行。出现代码行偏差(姑且叫做代码行偏差吧)的原因会在后面的文章讲解调试器的工作原理时讲到。
“Exceptions”对话框中还有一种异常类型:“Managed Debugging Assistants”是CLR 2.0新增加的特性,我们将会在讲解使用Visual Studio进行调试的时候讲到它。
- CLR Debugger - 在程序抛出异常的时候中断程序的执行
- CLR Debugger - 在程序抛出异常的时候中断程序的执行
- CLR Debugger - 在程序抛出异常的时候中断程序的执行
- 使用xdebug调试YII程序的时候抛出CException异常
- 数据库中可以执行的sql语句,在程序中执行抛出乱码异常
- 如何在程序启动的时候自动挂接Debugger
- 如何在程序启动的时候自动挂接Debugger
- 如何在程序启动的时候自动挂接Debugger
- CLR如何执行程序集的代码
- 中断和异常处理程序的嵌套执行
- MFC程序抛出xstring异常的问题
- 一个递归抛出异常的java程序
- C++程序抛出异常后执行顺序
- Java如何将处理完异常之后的程序能够从抛出异常的地点向下执行?
- 金蝶EAS,后台抛出业务异常,中断程序
- 程序中抛出异常
- VC程序异常中断的原因
- 线程最后退出的时候抛出异常
- JS省市地区联动(PCAS)
- C#成员访问和抽象类与接口
- 开源啦~~ 傻鸡鸡 分词程序 Beta 0.1版
- vm下linux不能启动Xwindows,怎么办?http://seven.blog.51cto.com/120537/58361
- Joomla论坛组件Kunena1.6.5中文语言包
- CLR Debugger - 在程序抛出异常的时候中断程序的执行
- 【汇编】将十进制数转换为对应的ascii码值
- C#预处理器指令和字符串处理
- PHP和JS中""和''的区别
- A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux
- C#文件和目录
- 从程序员角度看ELF
- 利用jxl读写Excel
- UNIX/LINUX 平台可执行文件格式分析