首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • try/catch与性能 [已结帖,结帖人:lwp1493]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lwp1493
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-23 11:34:16 楼主
    在程序中如何使用,什么时候使用try/catch
    它对性能又有什么影响?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CNLAN
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 11:38:231楼 得分:1
    你觉得有异常出现就用它.
    这个没什么影响的...
    反正你不手工捕捉,系统也会帮你自动捕捉的...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ling3wei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 11:39:002楼 得分:1
    当操作可能引发异常时使用啊,如数据库连接时,对性能没有什么影响吧,学习....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ojlovecd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 11:39:133楼 得分:1
    try/catch是捕获异常用的,用于可能会出现异常的地方,当出现异常的时候对异常进行处理,它跟性能有关系吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • amandag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-23 12:01:004楼 得分:4
    使用try/catch是影响系统的性能的,最简单的道理是我们一般把try块称之为监视块,你派个东西监视你的代码,这能不消耗额外的资源么?

    在程序中如果能有其他方式避免异常,则需要考虑避免使用try/catch

    比较典型的处理是,比如做类型转换的时候,用int.TryParse而不是int.Parse,这样就不用去捕获System.FormatException

    如果你要处理 x/y这样的表达式,提前判断了y是否为0,就不用去处理System.DivideByZeroException

    在使用数组的地方,使用 Length属性而不是固定值,可以防止System.IndexOutOfRangeException

    但如果是我们的程序无法处理的问题,那么就必须使用异常处理了,必须你向用户的D盘写一个文件,用户可能没有D盘,可能D盘是光驱,可能D盘空间不够,这个不是我们的程序能解决的,就只能用异常处理了

    最后,当项目比较大的时候,异常处理可能导致你无法找到你出错的地方。

    所以,慎重使用异常处理。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 12:06:455楼 得分:1
    哇 好详细 晓习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 12:10:046楼 得分:1
    会在il多生成一些代码
    不过这也是个度的问题
    也不能因噎废食啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ojlovecd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 12:48:427楼 得分:1
    引用 4 楼 amandag 的回复:
    使用try/catch是影响系统的性能的,最简单的道理是我们一般把try块称之为监视块,你派个东西监视你的代码,这能不消耗额外的资源么?

    在程序中如果能有其他方式避免异常,则需要考虑避免使用try/catch

    比较典型的处理是,比如做类型转换的时候,用int.TryParse而不是int.Parse,这样就不用去捕获System.FormatException

    如果你要处理 x/y这样的表达式,提前判断了y是否为0,就不用去处理System.DivideByZeroException


    学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • spgoal
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 13:04:328楼 得分:5
    http://181796968.blog.51cto.com/213419/41776
    上面的文章可以参考一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhh63
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 13:08:249楼 得分:5
    4楼好象把整个事情说反了。

    --你派个东西监视你的代码,这能不消耗额外的资源么?

    抛出异常是CPU内部的固有功能,当CPU计算或寻址出错时会产生一个硬件中断,中断程序会处理try/catch代码。所以完全不影响性能,并没有派个东西监视你的代码。


    --在程序中如果能有其他方式避免异常,则需要考虑避免使用try/catch
    --比较典型的处理是,比如做类型转换的时候,用int.TryParse而不是int.Parse,这样就不用去捕获ystem.FormatException

    正好相反,在程序中应尽量使用try/catch,比如做类型转换的时候,如果自己编一段程序去判断原始数据的格式是不明智的,有些判断比较复杂(bouble、DateTime等等),会浪费保贵的时间,还会影响程序的性能,还不容易把所有异常都考滤进来,比如咱们很少考滤内存够不够等等。


    --当项目比较大的时候,异常处理可能导致你无法找到你出错的地方。
    当项目较大的时候异常处理显示的错误信息会帮助你尽快的找到出错的地方。


    在程序中不仅要使用系统的异常,还有学会自己抛出异常。具体方法是在所有的子程序中抛出异常,在主程序中显示异常信息,这已经成为一种代码规范。以下是一个实例。

    //主程序显示异常
    function onSubmit()
    {
    try
    {
    VerifyPage();
    Form1.submit();
    }
    catch( err )
    {
    alert( err.description );
    }
    }

    //子程序抛出各种异常
    function VerifyPage()
    {
    var strerr = "Please make your information completely.";

    if( document.getElementById('TextBox3').value == "" )
    throw( new Error( strerr ) );

    isEmail( document.getElementById('TextBox3').value );
    }

    //子子程序抛出各种异常
    function isEmail( stremail )
    {
    if( stremail == null || stremail == "" )
    throw( new Error( "Please Enter the E-mail!" ) ) ;

    if( stremail.length > 100 )
    throw( new Error( "E-mail is too long!" ) );

    var regu ="^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*[0-9a-zA-Z]+))@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2}|net|NET|com|COM|gov|GOV|mil|MIL|org|ORG|edu|EDU|int|INT)$";
    var re = new RegExp(regu); 
    if( stremail.search(re) == -1 )
    throw( new Error( "Is not validate E-mail address!" ) );
    else
    return
    }


    总之,使用try/catch能够使代码简捷明析,提高程序性能。目前已成为编程规范。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luckyp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 13:21:5210楼 得分:1
    引用 9 楼 hhhh63 的回复:
    4楼好象把整个事情说反了。

    --你派个东西监视你的代码,这能不消耗额外的资源么?

    抛出异常是CPU内部的固有功能,当CPU计算或寻址出错时会产生一个硬件中断,中断程序会处理try/catch代码。所以完全不影响性能,并没有派个东西监视你的代码。


    --在程序中如果能有其他方式避免异常,则需要考虑避免使用try/catch
    --比较典型的处理是,比如做类型转换的时候,用int.TryParse而不是int.Parse,这样就不用去捕获ys…


    这个是对的。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhh63
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 13:23:3811楼 得分:1
    补充一下,在子程序中抛出异常实际上是取代了过去的返回错误代码。另外finally很有用,多写就有体会了。 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wdgphc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 13:24:2712楼 得分:1
    调试的时候尽量不要try/catch,便于找出问题.
    发布的时候为了控制一些不可预知的错误影响你的进程准确,再加上try.

    程序正确运行时应该不收影响,一旦在某句中出现错误要跳到catch时,性能会明显有不同.(降低)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • icdbow
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 14:06:1513楼 得分:1
    抛出异常是CPU内部的固有功能,当CPU计算或寻址出错时会产生一个硬件中断

    CPU是会抛出中断,但是注意的是:现在的高级语言都是有个监视异常的类,这
    个是一直在系统的后台运作,也可以说windows自己就有这个异常判断,所以,
    基本不会影响性能。

    “抛出异常是CPU内部的固有功能”,这句话根本就是错的,汇编写的少吧?呵
    呵,CPU只会运行和中断,在有就是现在的自我保护功能,压根就没有抛出异常
    的功能(有就好了,上个月一同事就不会吧北桥给烧了,因为抛异常会中断的)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yagebu1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 14:25:4714楼 得分:1
    学习了!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • No4000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 14:28:0615楼 得分:1
    学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 14:45:3316楼 得分:5
    基本上,类库部分不应该“隐藏”异常,而顶多可以做点处理(例如数据库回滚等)然后继续向外抛出异常,直到整个系统的最终(客户端)界面上来显示异常信息并决定如何重新开始一个用户触发的操作。在类库中,用try/catch参与逻辑控制是不好的编程习惯。一旦遇到try/catch,首先应该要求程序员看看是不是应该自己去检测和处理错误而不是throw异常。如果程序员实在是搞不明白如何处理问题,才应该throw异常。这点上很少去把一点点效率之争放在第一位的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 14:59:0517楼 得分:1
    处理异常时,固然CPU有异常中断,但是也要上层各个层面的软件系统一层层处理,而不是CPU直接把机器给关了。因此还是要花非常多时间的。因此,只有程序实在是无助时才应该抛出异常给最终的客户端界面,通常不允许作为一种逻辑控制手段。

    我几乎都是使用int.Parse而不是int.TryParse,这是因人而异的,通常就是要把问题抛出给最终客户界面,而不要求程序去自动处理异常。因为我大多数时候都不会去预先写好了文档要求程序此时必须处理什么样的错误,以及设计好处理错误之后的一切流程。如果没有设计好处理错误之后的程序流程,就不要为了效率而使用TryPase。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sp1234
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:02:4418楼 得分:1
    明确地处理异常,即在Catch后边非常清楚地检测异常类型的细节然后处理,这尚可接受。一种很恐怖的编程手段,就是有些人写程序会写一个“万能”的异常处理程序,这看上去聪明的隐藏异常的办法其实是使得程序数据混乱、无法调试,这类程序直接应该被挑出来重写。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • brz97
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:04:4519楼 得分:1
    尽量少用try..catch,如果预计到可能出错就多些点if..else
    那样都比try..catch好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lude8880
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:15:1820楼 得分:1
    try和 catch就是用ifthenelse实现的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zpcoder
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:23:2921楼 得分:1

    三个字:  不很好
    四个字:  不特别好
    五个字:  尽量少用好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xueyou98
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:31:0222楼 得分:1
    楼上的说得真好

    哈哈,不用更好~

    因为可以保证无错了嘛!~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lude8880
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 15:56:2923楼 得分:1
    非常好 ,用得很舒服,因为就是 if then else
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhh63
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:03:0724楼 得分:4
    抛出异常是CPU内部的固有功能,当CPU计算或寻址出错时会产生一个硬件中断,中断程序会处理try/catch代码。

    这是我写的原话,这是最底层的抛出异常。“硬件中断”是计算机专业术语,意思是中断当前的指令流,执行另一段指令,并不是把CPU或计算机关了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luckyp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:15:4525楼 得分:1
    继续进来学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hertcloud
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-23 17:22:2326楼 得分:1
    第一次听说
    一段代码 外 加了try ...catch...
    还是提高 性能的做法...


    只能等牛X 了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CNLAN
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:22:4727楼 得分:1
    我觉得没有什么性能影响.
    当然像4楼所说,提前把出错的东西判断,这样更好,这样就不会出现异常...

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lude8880
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:39:4128楼 得分:1
    没有try 和 catch的程序不是好程序
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hhhh63
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 17:50:3229楼 得分:3