今天在阅读 .net 源码时发现微软对所有使用枚举类型的地方对枚举值进行了检测,在检测不通过时抛出了异常。

    if (!System.Windows.Forms.ClientUtils.IsEnumValid(value, (int) value, , ))
{
throw new InvalidEnumArgumentException("value", (int) value, typeof(PictureBoxSizeMode));
}

下面的demo展示了枚举类型的正确使用方法,异常的原因和抛出枚举异常的方法:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
static void Main(string[] args)
{
try
{
ConsoleDay(Days.Fri); //正确的使用枚举
ConsoleDay((Days));
ConsoleDay((Days)); //枚举异常的来源
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
Console.ReadLine();
}
static void ConsoleDay(Days day)
{
int dayInt = (int)day;
if (dayInt < || dayInt > )//检测枚举
{
throw new InvalidEnumArgumentException("day", dayInt, typeof(Days));//抛出枚举异常
}
Console.WriteLine(day);
}
}
}

关于异常,除了在各个接口中使用 try catch finally 来处理外,还可以对整个程序的异常统一处理。

以 winform 为例,可以修改 program.cs 文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms; namespace PrintTest
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //处理 UI 线程的异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); //处理非 UI 线程的异常
Application.Run(new Form1());
} static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject.ToString());
MessageBox.Show(e.ExceptionObject.ToString());
}
}
}

我们可以依赖 .net 来生成异常,也可以自己 new 一个异常,这样可以定制异常的 message:

 class Program
{static void Main(string[] args)
{
try
{
ConsoleDivision(, );
ConsoleDivision(, );
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
Console.ReadLine();
} static void ConsoleDivision(int num1, int num2)
{
//if (num2 == 0)
//{
// throw new DivideByZeroException("num2不能是零");
//}
Console.WriteLine(num1 / num2);
}
}

当程序的结构较深时需要嵌套异常,使用 new Exception() 的重载,方便定位:

    class Program
{
static void Main(string[] args)
{
try
{
DoSomeThing();
}
catch (Exception err)
{
string innerMsg = err.InnerException == null ? "" : " innerExceptionMessage:" + err.InnerException.Message;
Console.WriteLine(err.Message + innerMsg);
}
Console.ReadLine();
} static void DoSomeThing()
{
try
{
ConsoleDivision(, );
}
catch (Exception err)
{
throw new Exception("DoSomeThing异常", err);
}
} static void ConsoleDivision(int num1, int num2)
{
if (num2 == )
{
throw new DivideByZeroException("num2不能是零啊");
}
Console.WriteLine(num1 / num2);
}
}

当需要区分异常时可以使用多个 catch (注意将catch(Exception err)放在最后面,因为 Exception 是所有异常的基类,必然捕获),可以自定义各种类型的异常。

namespace ConsoleApplication1
{
class MyException : Exception
{
public MyException()
: base()
{
} public MyException(string str)
: base(str)
{
} public MyException(string str, Exception inner)
: base(str, inner)
{
}
}
class Program
{
static void Main(string[] args)
{
try
{
throw new MyException("");
//throw new DivideByZeroException();
}
catch (MyException err)
{
Console.WriteLine("MyException捕获" + err.Message);
}
catch (Exception err)
{
Console.WriteLine("Exception捕获" + err.Message);
} Console.ReadLine();
}
}
}

c# 闲谈异常处理的更多相关文章

  1. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  2. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  3. 异常处理汇总 ~ 修正果带着你的Net飞奔吧!

    经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...

  4. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  5. IL异常处理

    异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...

  6. Spring MVC重定向和转发以及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  7. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  8. 札记:Java异常处理

    异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...

  9. 关于bug分析与异常处理的一些思考

    前言:工作三年了,工作内容主要是嵌入式软件开发和维护,用的语言是C,毕业后先在一家工业自动化控制公司工作两年半,目前在一家医疗仪器公司担任嵌入式软件开发工作.软件开发中,难免不产生bug:产品交付客户 ...

随机推荐

  1. PowerDesigner连接MySQL

    1.使用JDBC连接,地址:http://dev.mysql.com/downloads/connector/j/ 2.需安装Java(应该只要JRE):http://www.oracle.com/t ...

  2. Spring AOP 详解 【转】

      此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另 ...

  3. 用word发CSDN blog

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  4. 编写高质量代码改善C#程序的157个建议——建议147:重构多个相关属性为一个类

    建议147:重构多个相关属性为一个类 若存在多个相关属性,就应该考虑是否将其重构为一个类.查看如下类: class Person { public string Address { get; set; ...

  5. ExtractStrings字符串截取

    //分割字符串 ExtractStrings var   s: String;   List: TStringList; begin   s := 'about: #delphi; #pascal, ...

  6. TSQL--游标Dem

    DECLARE @ID INT; ); ); DECLARE MyCursor CURSOR FOR ) ID,NAME1 FROM dbo.TB1 ORDER BY ID; OPEN MyCurso ...

  7. VMware+Linux更改磁盘配额(使用gparted LiveCd) 实用!!!

    转载:http://blog.csdn.net/microad_liy/article/details/7667670 写这篇文章的原因: 最近要给服务器Centos上的ruby版本升级,由于是第一次 ...

  8. selenium+jenkins+maven+testNG搭建持续集成环境

    为了简明起见,分几大部分,很基础的细节就不详述了 一·安装jenkins 二·创建一个maven项目的job 2.1   填上SVN的Repository URL 2.2  由于是在本地执行maven ...

  9. PostgreSQL按年月日分组

    Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...

  10. Python 串口通信 GUI 开发

    在项目中遇到树莓派串口通信问题.由于本人一直从事.net 开发,希望将树莓派系统换成Win10 IOT版.但是在测试过程中出现无法找到串口的问题.最终也没有解决.最终按照领导要求,linux (了解不 ...