今天在阅读 .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. CircRNA 环化RNA

    2016国自然新秀CircRNA的研究策略和分析  

  2. 对SOA架构思想的一些说明(转)

    出处:http://kb.cnblogs.com/page/510698/ 从纵向到横向 传统业务系统的构建更多的是竖井式的纵向思想,这个主要是从单个业务系统孤立来看都是垂直应用.那么SOA架构的视角 ...

  3. ubuntu 16.04快速建lvm

    1.准备2块虚拟硬盘 在执行下面之前先安装:lvm和mkfs.xfs apt install lvm2 -y apt install xfsprogs dd if=/dev/zero of=ceph- ...

  4. CodeForces 346A Alice and Bob (数学最大公约数)

    题意:有一堆数,然后有两个人轮流从中取出两个数,这两个数的差的绝对值不在这个集合,然后把这个数放进这个集合,如果哪个人不能拿了,就是输了,问你谁赢. 析:当时连题意都没看好,以为拿出两个数,就不放回了 ...

  5. 编写高质量代码改善C#程序的157个建议——建议95:避免在构造方法中调用虚成员

    建议95:避免在构造方法中调用虚成员 在构造方法中调用虚方法会带来一些意想不到的错误,虽然这种方法不常见,但还是需要注意这类陷阱. static void Main() { American amer ...

  6. Sed的使用方法简介

    =============Sed================== Sed:是一款流编辑工具,用来对文本进行过滤与替换工作,特别是当你想对几十个配置文件进行统一修改时,你会体会到它的魅力:Sed通过 ...

  7. jquery实现简单瀑布流

    瀑布流这个概念一直不是很理解,看到别人可以实现,自己弄了很久还是不能实现就很纠结.瀑布流这根刺就一直扎在我心里,一次偶然的机会看到别人实现了瀑布流,我想我是不是也应该再继续把这个未完成的任务画一个圆满 ...

  8. 转:javascript判断IE浏览器

    http://blog.csdn.net/ranbolwb/article/details/18555847 function isIE() { //ie? if (!!window.ActiveXO ...

  9. C# 数字转换成汉字大写 数值转换成汉字大写

    1.数字转换成汉字大写 public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com st ...

  10. 关于Relay的麻烦之处

    问题背景 由于QueryRender是直接将数据塞进Render()里的 handleUpdate = (hasNextPage, xdata) =>{ console.log(3); cons ...