今天在阅读 .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. left join、right join、inner join、full join

    转自:某一网友 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join ...

  2. 使用word 2013 发布csdn博客

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

  3. sql五大类中的 DTL 数据事务语言

    DTL,数据事务语言 事务的定义:就是指一组相关的SQL操作,我们所有的操作都是事务中的. 注意:在数据库中,执行业务的基本单位是[事务],不是以某一条SQL.    数据库在默认情况下,事务是都打开 ...

  4. 【小梅哥FPGA进阶教程】第十一章 四通道幅频相可调DDS信号发生器

    十一.四通道幅频相可调DDS信号发生器 本文由山东大学研友袁卓贡献,特此感谢 实验目标 实现多通道可调信号发生器 实验平台 芯航线FPGA核心板.ADDA模块 实验现象 实现基于FPGA的多通道可调信 ...

  5. linux 文件系统基本结构

    1.Linux文件系统为一个倒转的单根树状结构 2.文件系统的根为"/" 3.文件系统严格区分大小写 4.路径使用"/",与Windows使用"\&q ...

  6. [示例] Drag And Drop for FireMonkey (Win & macOS)

    源码下载: https://github.com/OneChen/DragAndDrop 效果:

  7. BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面

    BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面 bolt 基本介绍 Bolt界面引擎是迅雷公司从2009年开始开发的第四代界面库.迅雷7是首个采用该引擎成功开 ...

  8. AOP原理解析及Castle、Autofac、Unity框架使用

    转自:https://www.cnblogs.com/neverc/p/5241466.html AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP), ...

  9. 虚拟化 - Docker

    Docker Desktop (for windows and mac) Docker Desktop 注意 安装时有可能卡主,可以关掉重新装 重启启动时,可能报错"VIRTUALIZATI ...

  10. a标签点击时跳出确认框

    在做一些删除等的操作时,在跳转链接前,需要弹出一个确认框确认,避免误点. 方法一: <a  href="http://www.baidu.com" onClick=" ...