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都是没必要的


版权声明:

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

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

l  文章内容部分来源于互联网,不代表本人的任何立场;涉及到的软件来源于互联网,仅供个人下载使用,版权归该软件开发者所有,请勿用于商业用途,下载后请于24小时内删除,请支持正版!因下载本站资源造成的损失,全部责任由使用者本人承担!如果你是原作者,认为本文内容对您的权益有所侵犯,请联系博主进行投诉,待博主进行严格地审查和背景调查后,情况属实的将在三天内将本文删除或修正。

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

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

l  博主只是一名普通的互联网从业者,不懂修电脑,不会卖电脑,不会帮你盗号,不会破解开机密码,找不回你丢失的手机等,如有这样的想法请绕道!

相关推荐:

asp.net即时通信框架——signalR起步 所有编程语言为我作证,随机数"骗局"大揭秘,随机数都是骗人的!
再谈http请求的GET和POST的区别,以及为什么网上的多数答案都是错的。 补上博文一篇:由鹿晗公布恋情而引发的一次人生思考🤔
从.NET+25台服务器支撑世界第54大网站浅谈网站优化 互联网架构之浅谈数据库用户表结构设计与第三方登录接入

评论区:

    还没有评论哦,赶紧来写评论吧

    分享按钮