开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 6813|回复: 4

[源码] 用自定义异常类及手动抛出异常来进行异常处理

[复制链接]

0

精华

317

贡献

26

赞扬

帖子
151
软币
3202
在线时间
740 小时
注册时间
2013-6-11
QQ
发表于 2013-8-13 15:34:22 | 显示全部楼层 |阅读模式
根据网上找到的资料和自己测试的结果总结的,感觉挺方便,还望高手指正.
1,自定义全局异常类
public class CustomExceptionHandler
    {
        public CustomExceptionHandler()
        {
            Application.ThreadException += new ThreadExceptionEventHandler(this.OnThreadException);
        }
        private void OnThreadException(object sender, ThreadExceptionEventArgs args)
        {
            try
            {
                string errorMsg = "程序运行过程中发生错误,错误信息如下:\n";
                errorMsg += args.Exception.Message;
                errorMsg += "\n发生错误的程序集为:";
                errorMsg += args.Exception.Source;
                //errorMsg += "\n发生错误的具体位置为:\n";
                //errorMsg += args.Exception.StackTrace;
                MessageBox.Show(errorMsg, "运行时错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch
            {
                MessageBox.Show("系统运行时发生致命错误!\n请保存好相关数据,重启系统。", "致命错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
    }


2,主窗体加载前创建自定义异常类实例
static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        private static void Main()
        {
                XpoDefault.ConnectionString = ConnectionHelper.ConnectionString;
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                CustomExceptionHandler customException =new CustomExceptionHandler();
                Application.Run(new Form1());
        }
    }

3,在逻辑层手动抛出可能出现的错误
public pcm_42 GetPcm42ByPartyCode(string code)
        {
            try
            {
                if (string.IsNullOrEmpty(code))
                {
                    throw new Exception("查询条件客户代码为空请输入");
                }
                var query = pcm42service.GetCustomByPartyCode(code);
                if (!query.Any())
                {
                    throw new Exception("没有找到代码为:"+code+"的客户");
                }
                return query.Single();

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
这样在UI层如果该输入条件的地方没有输入,或没有查询到相关数据程序会自动弹出相应提示.

回复

使用道具 举报

0

精华

5149

贡献

5383

赞扬

管理员

帖子
1156
软币
21175
在线时间
4337 小时
注册时间
2013-6-7

黄马甲

发表于 2013-8-13 15:38:03 | 显示全部楼层
这仅仅捕获了UI线程异常,非UI线程的异常呢?
回复

使用道具 举报

0

精华

317

贡献

26

赞扬

帖子
151
软币
3202
在线时间
740 小时
注册时间
2013-6-11
QQ
 楼主| 发表于 2013-8-13 16:13:25 | 显示全部楼层
天堂羽叶 发表于 2013-8-13 15:38
这仅仅捕获了UI线程异常,非UI线程的异常呢?

天堂老师,这样行吗?
public class CustomExceptionHandler
    {

        public CustomExceptionHandler()
        {
           
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            
            AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        }




        private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
            {
                string str = GetExceptionMsg(e.Exception, e.ToString());
                MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
                MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

         
            private string GetExceptionMsg(Exception ex, string backStr)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("****************************异常文本****************************");
                sb.AppendLine("【出现时间】:" + DateTime.Now.ToString());
                if (ex != null)
                {
                    sb.AppendLine("【异常类型】:" + ex.GetType().Name);
                    sb.AppendLine("【异常信息】:" + ex.Message);
                    sb.AppendLine("【堆栈调用】:" + ex.StackTrace);
                }
                else
                {
                    sb.AppendLine("【未处理异常】:" + backStr);
                }
                sb.AppendLine("***************************************************************");
                return sb.ToString();
            }
        }
回复

使用道具 举报

0

精华

5149

贡献

5383

赞扬

管理员

帖子
1156
软币
21175
在线时间
4337 小时
注册时间
2013-6-7

黄马甲

发表于 2013-8-13 17:15:36 | 显示全部楼层
嗯,这样不错,不过为什么叫我老湿?
回复

使用道具 举报

0

精华

317

贡献

26

赞扬

帖子
151
软币
3202
在线时间
740 小时
注册时间
2013-6-11
QQ
 楼主| 发表于 2013-8-13 17:19:42 | 显示全部楼层
天堂羽叶 发表于 2013-8-13 17:15
嗯,这样不错,不过为什么叫我老湿?

呵呵,常看你的帖子,确实是老师.
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-5-21 01:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表