一、异常的构成

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. Spring+mybatis 实现aop数据库读写分离,多数据库源配置

    在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应用中,数据库都是读多写少 ...

  2. ios和android的发展前景比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt164 一直都有很多人在讨论未来的IOS和android市场哪个前景更好,现在 ...

  3. Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

    注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...

  4. Bash 脚本进阶,经典用法及其案例

    前言:在linux中,Bash脚本是很基础的知识,大家可能一听脚本感觉很高大上,像小编当初刚开始学一样,感觉会写脚本的都是大神.虽然复杂的脚本是很烧脑,但是,当我们熟练的掌握了其中的用法与技巧,再多加 ...

  5. grunt之connect、watch

    先说下这两个插件配合的用处,简单的说,它们可以拯救你的F5.connect用于建立一个静态服务器,watch监听文件的修改并自动实时刷新浏览器的页面. 还是options走起. connect(V0. ...

  6. JavaScript封装一个MyAlert弹出框

    平时我们想要显示一些提示信息时会用到alert方法,alert是全局的一个方法,会短暂的中断程序,我们主要用来显示提示客户信息.但是这个方法有一定的局限性,而且本身样式也不够美观.于是我封装了一个实用 ...

  7. 第二次作业:编写一个四则运算的"软件"

    - 题目: 请编写一个能自动生成小学四则运算题目的 “软件”. 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. 需求分析: ●基本功能 ●实现100以内的加法 ●实现100以内 ...

  8. 【1414软工助教】团队作业3——需求改进&系统设计 得分榜

    题目 团队作业3--需求改进&系统设计 作业提交情况情况 本次作业所有团队都按时提交作业. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 ...

  9. 201521123031 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 答:实现con ...

  10. 201521123038 《Java程序设计》 第三周学习总结

    201521123038 <Java程序设计> 第三周学习总结 1. 本周学习总结 附大图链接 http://naotu.baidu.com/file/5774caa2be710afbc0 ...