一、异常的构成

new Exception() 创建异常对象

throw 抛出异常对象(主要性能损耗位置)

try{}catch{} 捕捉异常对象

C#里面异常对象分为两个子类ApplicationException、SystemException,前者主要是提供给应用程序自定义的异常类,后者是提供给系统定义的异常类

二、如何使用异常

异常的正常逻辑是:由底层抛出,由高层处理

1、底层方法或者提供给其他人使用方法内的一些参数过滤或其它异常应该向上抛出

如(借鉴现成代码懒得写了):

public void InsertUser(User user)
{
if(user==null)
{
throw new ArgumentNullException("参数user为null");
}
//调用Orm
}

2、上层应该加上try{}catch{}来捕捉异常并处理

如:

try
{
bll.InsertUser(null);
}
catch (ArgumentNullException e)
{
LogHelper.Write(e.Message);
}

3、避免一些错误的异常处理方式

如(借鉴现成代码懒得写了):

/*
用异常验证用户输入
用户输入的合法性验证是属于业务逻辑的一部分,绝对不要用异常去处理,注意,是用户输入,所以这个经验仅限于表现层逻辑
*/
//典型错误1
try
{
int i=int.Parse(textBox1.Text);
}
catch(Exception ex)
{
alert(“不要输入非数字”);
}
//典型错误2
void ValidateInput(int i)
{
if(i<&&i>)
{
throw new Exception("输入数据范围错误");
}
}
/*
将异常交由给底层处理
这个错误在于完全不验证用户输入而直接把数据的验证抛向数据库,等待数据库报错来判断用户输入的正确性,这个是非常致命的错误,很多注入漏洞都是由此产生的
*/
//典型错误3
try
{
string name=Request.QueryString["xx"];
List<User> userls=User.QueryUserByName(name);
}
catch(SqlException ex)
{
}
/*
完全不用异常机制
产生这个错误肯定是一个非常脑残的决定造成的。不过很多时候某些不了解异常机制的人,由于对异常的性能开销的恐惧感,经常会做出这么脑残的决定
性能倒是高了,但是系统异常怎么办呢?一旦数据库出错就只等着系统崩溃了。某些有经验的说我会把下面的try{}catch{}起来,不过那不是脱了裤子放屁么,异常都抛出来了,开销已经产生了,结果换来的是牺牲了异常对象的丰富信息而换来了畸形的系统逻辑。性能也没得到提高
*/
//典型错误4
public bool InsertUser(User user,ref int errcode)
{
if(user==null)
{
errcode=;//参数为空错误的代码 return false;
}
//调用Orm
}

三、异常的性能测试

结论:

1、new Exception() 异常对象和创建普通对象的性能损耗没太大差别

2、throw 抛出异常时会造成系统性能损耗,主要在于“填充运行的堆栈信息”、“记录异常快照”等

3、try{}catch{}不会造成明显的系统开销,加不加性能区别不大

4、对外提供的方法尽可能抛出异常,避免程序崩溃,使用时请继承ApplicationException基类

5、业务逻辑上的数据尽量用if{}else{}过滤掉,不要靠throw new Exception()来处理

6、异常在程序中无法避免,合理使用避免程序崩溃才是唯一正确的道路

(以上结论仅代表个人观点)

    public class TyhTest
{
private string msg;
public TyhTest(string msg)
{
this.msg = msg;
}
} public class TyhException : ApplicationException
{
//这种写法是继承基类构造方法
public TyhException(string msg): base(msg)
{ }
} class Program
{
static void Main(string[] args)
{
int max = ;
int j = ;
string str = "a";
//==========
Stopwatch time1 = new Stopwatch();
time1.Start();
for (int i = ; i < max; i++)
{
try
{
if (j > && !string.IsNullOrEmpty(str))
throw new Exception("Exception异常");
}
catch (Exception e)
{ }
}
time1.Stop();
Console.WriteLine("抛出Exception异常耗时:" + time1.ElapsedMilliseconds);
//==========
Stopwatch time2 = new Stopwatch();
time2.Start();
for (int i = ; i < max; i++)
{
try
{
if (j > && !string.IsNullOrEmpty(str))
throw new ApplicationException("Exception异常");
}
catch (ApplicationException e)
{ }
}
time2.Stop();
Console.WriteLine("抛出ApplicationException异常耗时:" + time2.ElapsedMilliseconds);
//==========
Stopwatch time3 = new Stopwatch();
time3.Start();
for (int i = ; i < max; i++)
{
try
{
if (j > && !string.IsNullOrEmpty(str))
throw new TyhException("Exception异常");
}
catch (Exception e)
{ }
}
time3.Stop();
Console.WriteLine("抛出自定义TyhException异常耗时:" + time3.ElapsedMilliseconds);
//==========
Stopwatch time4 = new Stopwatch();
time4.Start();
for (int i = ; i < max; i++)
{
try
{
if (j > && !string.IsNullOrEmpty(str))
{ }
else
{ }
}
catch (Exception e)
{ }
}
time4.Stop();
Console.WriteLine("不抛异常用IF判断耗时:" + time4.ElapsedMilliseconds);
//==========
Stopwatch time5 = new Stopwatch();
time5.Start();
for (int i = ; i < max; i++)
{
try
{
var test = new TyhTest("创建对象");
}
catch (Exception e)
{ }
}
time5.Stop();
Console.WriteLine("创建普通对象TyhTest耗时:" + time5.ElapsedMilliseconds);
//==========
Stopwatch time6 = new Stopwatch();
time6.Start();
for (int i = ; i < max; i++)
{
try
{
var test = new Exception("创建异常对象");
}
catch (Exception e)
{ }
}
time6.Stop();
Console.WriteLine("创建异常对象Exception耗时:" + time6.ElapsedMilliseconds); Console.ReadKey();
}
}

(Stopwatch 不需要 new 很多个,代码复制粘贴的,请忽略,忽略,哈哈~)

正确使用Exception异常对象的更多相关文章

  1. Interrupted Exception异常可能没你想的那么简单!

    摘要: 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常.如果我们对InterruptedException异常处理 ...

  2. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  3. terminate called without an active exception异常

    在gcc4.4下,采用回调机制写了一个类似std::thread的线程类. 但是使用时却发生了核心已转移的错误. main函数调用的代码大致是 int main(int argc, char *arg ...

  4. C# 各类常见Exception 异常信息

    一直对报错有些迷惑的地方,什么时候try,catch那些Exception更合适,报错信息更能快速定位问题所在... 转载链接← 正文 Exception: 所有异常对象的基类. SystemExce ...

  5. python第三十课--异常(异常对象传递过程)

    演示异常对象传递的过程(往上“抛”),并将其解决 def func1(): print('func1...') print(10/0) def func2(): print('func2...') t ...

  6. mvc 使用预置队列类型存储异常对象

    using PaiXie.Utils; using System; using System.Collections.Generic; using System.Linq; using System. ...

  7. python基础之内置异常对象

    前言 什么叫异常?简单来说就是程序运行发生了预计结果之外的情况从而导致程序无法正常运行.而python解释器将一些常见的异常情况在它发生时打包成一个异常对象,我们可以通过捕捉这些异常对象从而进行处理, ...

  8. Java Exception异常介绍

     一:介绍java异常       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwab ...

  9. throws/throw Exception 异常应用

    throws通常用于方法的声明,当方法中发生异常的时候,却不想在方法中对异常进行处理的时候,就可以在声明方法时, 使用throws声明抛出的异常,然后再调用该方法的其他方法中对异常进行处理(如使用tr ...

随机推荐

  1. struts2和spring mvc的比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt236   Struts2 Springmvc       机制 基于filt ...

  2. unity中object 对象之间用c# delegate方式进行通信

    unity 3D经常需要设计到不同object之间数据通信和事件信息触发.这里可以利用C#本身的事件和代理的方法来实现. 这里实现了在GUI上点击按钮,触发事件,移动object cube移动的例子. ...

  3. 201521123038 《Java程序设计》 第六周学习总结

    201521123038 <Java程序设计> 第六周学习总结 1. 本周学习总结 2. 书面作业 1.clone方法 1.1 Object对象中的 clone 方法是被protected ...

  4. 201521123011 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口: 常用应用层协议:http, ftp 域名(通过域名可以找到IP)用ping测试 ...

  5. 201521123051《Java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. ·所有的异常类是从 java.lang.Exception 类继承的子类. ·Exception 类是 Throwa ...

  6. java课程设计(团队)-五子棋

    单机五子棋小游戏 一:团队介绍 组长:网络1511,毛卓 组员:网络1511,朱潞潞 组员:网络1511,范阳斌 二:项目git提交记录截图 三:项目使用主要技术 netBeans,GUI 四:项目特 ...

  7. MD格式示例

    一个例子: 例子开始 1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一 ...

  8. 201521123074 《Java程序设计》第1周学习总结

    1. 本章学习总结第一周学习总结: 学习了java语言的历史与发展,运行过程,安装了eclipse编程平台,试着编写了java程序. 2. 书面作业: Q 1.为什么java程序可以跨平台运行?执行j ...

  9. CoordinatorLayout的使用

    最近项目有一个需求,做出类似闲鱼鱼塘界面的效果.如下图: 所以想到用CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout去搭建此界面. Coor ...

  10. Mybatis第二篇【CRUD、分页】

    完成CRUD操作 我们在上一篇中已经简单知道了Mybatis是怎么使用的以及工作流程了,这次我们使用Mybatis来完成CRUD的操作,再次巩固Mybatis的开发步骤以及一些细节 包与类之间的结构 ...