c# 闲谈异常处理
今天在阅读 .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# 闲谈异常处理的更多相关文章
- 关于.NET异常处理的思考
年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- 异常处理汇总 ~ 修正果带着你的Net飞奔吧!
经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...
- JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
- IL异常处理
异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...
- Spring MVC重定向和转发以及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...
- 关于bug分析与异常处理的一些思考
前言:工作三年了,工作内容主要是嵌入式软件开发和维护,用的语言是C,毕业后先在一家工业自动化控制公司工作两年半,目前在一家医疗仪器公司担任嵌入式软件开发工作.软件开发中,难免不产生bug:产品交付客户 ...
随机推荐
- 05 Computing GC Content
Problem The GC-content of a DNA string is given by the percentage of symbols in the string that are ...
- java中interface使用
1.在C++中,类可以多重继承,一个类可以有好几个父类,但是在java中,类是不允许多重继承的,为了多重继承,java中出现了接口(interface)的定义.接口是可以多重继承的,接口的关键词是:i ...
- JSTL标签总结备用
前言 ========================================================================= JSTL标签库,是日常开发经常使用的,也是众多 ...
- Hadoop-2.4.0中HDFS文件块大小默认为128M
134217728 / 1024 = 131072 / 1024 = 128
- C# 生成dll文件 并导入使用
首先 在unity创建一个脚本 并编写内容,其中需要调用的方法.变量要公有化(也可以直接新建cs文件用编译器打开编译,但要先导入UnityEngine.dll). 然后,复制脚本关闭unity,在外界 ...
- 编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理
建议86:Parallel中的异常处理 建议85阐述了如何处理Task中的异常.由于Task的Start方法是异步启动的,所以我们需要额外的技术来完成异常处理.Parallel相对来说就要简单很多,因 ...
- C#函数式程序设计之惰性列表工具——迭代器
有效地处理数据时当今程序设计语言和框架的一个任务..NET拥有一个精心构建的集合类系统,它利用迭代器的功能实现对数据的顺序访问. 惰性枚举是一个迭代方法,其核心思想是只在需要的时候才去读取数据.这个思 ...
- apache mina2.0源码解析(一)
apache mina是一个基于java nio的网络通信框架,为TCP UDP ARP等协议提供了一致的编程模型:其源码结构展示了优秀的设计案例,可以为我们的编程事业提供参考. 依照惯例,首先搭建a ...
- CodeForces 227E Anniversary (斐波那契的高妙性质+矩阵快速幂)
There are less than 60 years left till the 900-th birthday anniversary of a famous Italian mathemati ...
- GitHub操作总结
GitHub操作总结 : 总结看不明白就看下面的详细讲解. . 作者:万境绝尘 转载请注明出处:http://blog.csdn.net/shulianghan/article/details/188 ...