在Main方法中设置异常的最后一次捕捉

在做Winfrom程序时,有时会遇到一个异常,可是这个异常不知道在什么地方发生的,程序会自动关闭,然后什么也没有了,在网上找到了一种方法,用来捕捉这种异常。

出现这种情况的原因是在程序中某些地方考虑不周全,有异常的情况没有考虑到,但是CLR不会在出错时给出提示(注:有些错误没有捕捉的话会自动弹出错误框,让用户选择关闭程序还是继续),所以就出了事了。。。

这时有一种方法来得到这种异常:

 1         /// <summary>
 2         /// 应用程序的主入口点。
 3         /// </summary>
 4         [STAThread]
 5         static void Main()
 6         {
 7             Application.EnableVisualStyles();
 8             Application.SetCompatibleTextRenderingDefault(false);
 9             Application.Run(new Form1());
10         }
11
12         static Program()
13         {
14             AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
15         }
16
17         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
18         {
19             string strException = string.Format("{0}发生系统异常。\r\n{1}\r\n", DateTime.Now, e.ExceptionObject.ToString());
20             File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SystemException.log"), strException);
21         }

这样就把异常记录在日志中了。

其实这次的纪录是为了处理一个让人烦恼的异常。程序在开始时没有什么问题,直到运行两天后,发生了异常,并且异常是在一个线程中出现的,有部分的提示信息,信息如下:

 1 2014-12-1 14:48:02发生系统异常。
 2 System.Data.RowNotInTableException: 此行已从表中移除并且没有任何数据。BeginEdit() 将允许在此行中创建新数据
 3    在 System.Data.DataRow.GetDefaultRecord()
 4    在 System.Data.DataRow.get_Item(Int32 columnIndex)
 5    在 异常处理.Form1.DemonstrateRowNotInTableException()
 6    在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
 7    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
 8    在 System.Threading.ThreadHelper.ThreadStart()
 9    在 System.Data.DataRow.GetDefaultRecord()
10    在 System.Data.DataRow.get_Item(Int32 columnIndex)
11    在 异常处理.Form1.DemonstrateRowNotInTableException()
12    在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
13    在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
14    在 System.Threading.ThreadHelper.ThreadStart()捕捉开始:

没有说明错误在哪一行,也没有弹出出错对话框,这是有原因的。

没有弹出错误对话框的原因:

  在一般情况下,如果出现了错误,会出现像下面的对话框。

  线程中不会出现异常对话框。这个深入的原因我也不知道,希望有明白此原因的能解释一下。

没有提示错误的所在行原因:

  在编译程序后,一般会有一个.pdb文件,这个就是调试使用的信息文件,里面保存了各种和调试有关的信息。在运行程序时,此文件被删除掉(我删除掉的原因就是在别人使用时不需要有调试这一步)的话,错误就不会精确到哪一行。添加上此文件,错误会出现具体的所在行。另,如果是Released程序,异常所在行提示不太准确,这个原因我也是不知道,在Debug下提示的行数是非常精确的。如果有人知道这个原因的话,希望也说一下,万分感谢!!

 1 2014-12-1 15:08:44发生系统异常。
 2 System.Data.RowNotInTableException: 此行已从表中移除并且没有任何数据。BeginEdit() 将允许在此行中创建新数据
 3    在 System.Data.DataRow.GetDefaultRecord()
 4    在 System.Data.DataRow.get_Item(Int32 columnIndex)
 5    在 异常处理.Form1.DemonstrateRowNotInTableException() 位置 \C#\Project\异常处理\异常处理\Form1.cs:行号 63
 6    在 异常处理.Form1.button2_Click(Object sender, EventArgs e) 位置 \C#\Project\异常处理\异常处理\Form1.cs:行号 38
 7    在 System.Windows.Forms.Control.OnClick(EventArgs e)
 8    在 System.Windows.Forms.Button.OnClick(EventArgs e)
 9    在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
10    在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
11    在 System.Windows.Forms.Control.WndProc(Message& m)
12    在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
13    在 System.Windows.Forms.Button.WndProc(Message& m)
14    在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
15    在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
16    在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
17    在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
18    在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
19    在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
20    在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
21    在 System.Windows.Forms.Application.Run(Form mainForm)

上面是在Debug下进行调试得到的信息。有提示行。

时间: 2024-10-04 02:38:50

在Main方法中设置异常的最后一次捕捉的相关文章

输入6个人的成绩放入到一个一维数组中,然后打印出平均分,最后按成绩 从大到小打印。三个功能(输入是一个函数,求平均分是一个函数,排序是一个 函数)都用函数实现,最后在main方法中调用。

/*5.输入6个人的成绩放入到一个一维数组中,然后打印出平均分,最后按成绩从大到小打印.三个功能(输入是一个函数,求平均分是一个函数,排序是一个函数)都用函数实现,最后在main方法中调用.*/ #include <stdio.h> int inputScore(){ int score; scanf("%d",&score); return score;} double avg(int scores[],int length){ int i,score = 0;

通过函数实现打印*号组成的直角三角形,函数要求传入行数即可。在main 方法中,通过用户输入得到行数,然后调用函数做打印。

#include <stdio.h> /* 1.通过函数实现打印*号组成的直角三角形,函数要求传入行数即可.在main方法中,通过用户输入得到行数,然后调用函数做打印.三角形样式:********************* */ int sanjiao(int hang){ int i; int j; for(i = 0; i < hang;i++) { for(j = 0;j <i+1;j++) { printf("*"); } printf("\n

JavaSE7基础 main方法中 String[] args的用法

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Demo{ //main方法中String[] args的用途 //接收调用main方法是 传入的字符串参数 public static void main(String[] args){ //看String数组的长度,即有几个字符串 System.out.println(args.length); for(int i=0,length=args.length;i<length;

Main方法中传入参数

↓ 这个时候会报错: Instantiate the class:DonutShop java.lang.ClassNotFoundException: DonutShop    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)    at java.security.AccessController.doPrivileged(Native Method)    at java.net.URLClassLoader.findCla

main方法中参数&quot;String[ ] args&quot;详解

1.在编写完一个有主方法的java文件时,需要在cmd窗口中先编译此java文件(javac xxx.java),然后再运行(java xxx) 其实在运行java xxx的时候如果后面跟着参数用空格分开,则将这参数保存到了String类型的数组中也就是main方法 的参数String [] args中 2.方法测试 public class HelloWorld { public static void main(String[] args) { if(args.length != 2){ S

main方法中窥世界

今天我们来看一个编程语言入门必演示的HelloWorld程序,借此来展示我们的重点知识.话不多说,先看代码. 本段代码在eclipse中编辑运行,怎么在eclipse中新建项目呢:点击左上角File选择New一个Project.虽然本例仅仅实现了一个简单的输出HelloWorld一行字符串的简单功能,但是万丈高楼平地起,一个工程所需要的东西它都有.目录结构如下: src文件夹中包含有多个包,包里有java源代码文件.为什么要分这么多层呢?主要便于文件组织和管理.把不同类型的文件放在不同的包里,这

为什么不要在viewDidLoad方法中设置开始监听键盘通知

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 一个普遍的错误是,程序猿(媛)试图在view controller的view不在屏幕上时监听键盘通知. 他们开始在viewDidLoad方法中开始监听通知,并且在dealloc方法中移除监听通知. 这是一种大有问题的行为,因为当你的视图不在屏幕上显示,而键盘开始显示在其他视图上的时候,你绝不应该在你的视图控制器中调整任何键盘组件的显示! 牢记这一点:键盘通知就

定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。(体现多态)

实现多态的三个条件:1.要有继承2.要有抽象方法重写3.用父类指针(引用)指向子类对象 重载重写重定义的区别: 1.重载:在同一个类中进行; 编译时根据参数类型和个数决定方法调用; 子类无法重载父类; 父类同名方法被子类该方法覆盖. 2.重写:在父类和子类之间进行; 父类与子类方法有完全相同类型; 在运行时根据具体对象类型决定方法调用; 3.在重写中有抽象方法的会产生多态;没有使用抽象方法叫重定义 以下具体代码具体分析: package test3;abstract class Shape{ /

30.编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

package zuoye8; public abstract class Shape { private double zhouchang ; private double mianji ; public Shape(double zhouchang, double mianji) { super(); this.zhouchang = zhouchang; this.mianji = mianji; } public Shape() { super(); } //抽象一个周长方法 publi