1. 首页
  2. 文章列表
  3. 你写的Try...Catch真的有必要么?

很多人喜欢用Try…Catch把每一个方法都包裹起来,可是真的有必要么?

  为什么要这样做?我估计是大家被BUG吓怕了,生怕生产环境出现各种莫名其妙的错误,比如最经典的NullReferenceException,可问题是你用Try…Catch包裹起来后错误是不会爆出来了,但是执行结果是你想要的么?恐怕bug还在那里,只是经过你的Try…Catch之后,bug更加难找了,原本你用vs调试起来,直接就断在了异常发生的地方,现在呢?你得一步步跟踪过去。

懒得勤快的博客_互联网分享精神

你写的Try...Catch真的有必要么?

   这不是最主要的问题,最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个Try…Catch,恐怕你早就发现这个bug了,因为程序压根就跑不下去。

  异常信息应该由最上层的框架捕获,比如MVC中有ExceptionFilter,你可以在这里记录详细日志,别把黄页抛给用户就可以了。我想写一个Try…Catch的场景,但是居然一下子想不出来一个很好的场景,因为真真需要写Try…Catch的场景是很少的,你一旦想写Try…Catch,首先想想你是不是在故意隐瞒Bug.

反而我鼓励大家写Throw exception,比如这种场景:

public void Register(string userName, string password)

{

    if (string.IsNullOrEmpty(userName))

        throw new InvalidDataException("user name can not be empty");

    if (string.IsNullOrEmpty(password))

        throw new InvalidDataException("password can not be empty");

    //....

}

public void Register(string userName, string password)

{

    try

    {

        //....

    }

    catch (Exception)

    {

    }

}

理论上,虽然UI做了各种校验,我们写的Register任然保持对参数的不信任,继续抛异常而不是Try..Catch,这样你是不是能提前发现UI没有校验的bug呢?

  追加内容:很多同学对此文的结论难以接受,最有疑问的就是“Try…catch可以记录日志,捕获异常的详细信息,不会让程序挂掉”, 我需要重申的是:Try…Catch的作用不是用来记录日志的,任何框架都在顶层提供了捕捉异常的方案:

  以.NET为例:

  1. Winform,可以:

AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(UnhandledExceptionFunction);

  2. Asp.net,可以在Application_Error()方法里捕获异常

  3. MVC,可以写ExceptionFilter

  4. WebApi,可以写ExceptionHandler

  这里面拿到的Exception都是带整个Stack记录的,你可以用Log4记录下来,并不是有的同学说的只会拿到e.message这样

  建议:少写Try…Catch,喜欢写Try…Catch的朋友注意:你那90%的Try…Catch都是没必要的


分享到:

速鹰666高速全隧道机场,每日签到免费领流量 [推广]

速鹰666高速全隧道机场,每日签到免费领流量

真正大鸡场,100多个节点,V2ray节点50多个。港台美日新均有白嫖节点,每日签到送1-7G流量。多条BGP中转/Azure/Dmit/HKT/Hinet/多点IPLC/保证高端用户使用需求。

文章历史版本:

修改次数:1 次 查看历史版本

相关推荐:

ASP.NET Core MVC/WebAPI中另辟蹊径的全局统一异常处理方式 Burp Suite Professional Edition v2020.4.1 x64 Full Activated + All Addons - 最新和谐版本
原声母带《老鹰乐队-加州旅馆》WAV-192KHz-64bit 无损分轨 1.24GB Clash for Windows 使用简易教程
从.NET+25台服务器支撑世界第54大网站浅谈网站优化 这又是史上最丧心病狂的大数据时代的IT术语解读😂
EX内核管理器 v5.51 已付费全功能解锁版+教程 软件行业毒瘤思杰马克丁软件公司内幕大起底
asp.net即时通信框架——signalR起步 linq调试神器之二——LinqPad 6.9.15 高级学习版

版权声明:

本文仅用于学习、研究和交流目的,欢迎非商业性质转载。本文链接:https://masuit.com/96

● 文章内容仅供参考,所涉及的软件以具体使用情况为准!

● 博主在此发文(包括但不限于汉字、拼音、拉丁字母)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人局部或全部同意、支持或者反对观点。如需要详查请直接与键盘生产厂商法人代表联系。挖井挑水无水表,不会网购无快递。

● 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。

● 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!

● 文章内容部分来源于互联网,本站不代表任何立场;涉及到的软件来源于互联网,仅供个人学习参考,请勿用于商业用途,版权归软件开发者所有,下载后请务必于24小时内删除,请支持正版!因下载本站任何资源造成的损失,全部责任由使用者本人承担!如果你是版权方,认为本文内容对您的权益有所侵犯,请联系本站管理员,并参照侵删联系的说明提交相应的证明材料,本站将进行严格地资质审查和背景调查后,情况属实的将在三天内对本文删除或修正。本站对互联网版权绝对支持!

● 本站一贯非常高度重视知识产权保护并遵守各项知识产权法律、法规和具有约束力的规范性文件。重视正版,打击盗版。根据法律、法规和规范性文件要求,本站旨在保护权利人的合法权益的措施和步骤,当权利人发现在本站生成的链接所指向的第三方网页的内容侵犯其合法权益时,权利人应事先向本站发出"权利通知",本站将根据当地法律法规和政府规范性文件采取措施移除相关内容或链接。 

● 访问本站的用户必须明白,本站对提供下载的第三方软件不拥有任何权利,其版权归该资源的合法拥有者所有。

● 本站保证站内提供的所有可下载资源(软件等)都是按“原样”提供,本站未做过任何改动;但本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。不论何种情形我们都不对任何由于使用或无法使用本站提供的信息所造成的直接的、间接的、附带的、特殊的或余波所及的损失、灵失、债务或中断负任何责任﹝不论是可预见或是不可预见的,即使我们巳被告知这种可能性﹞。

● 如遇资源报毒,请参阅:https://masuit.com/misc/14

评论区: