你写的Try...Catch真的有必要么?
目录
很多人喜欢用Try...Catch把每一个方法都包裹起来,可是真的有必要么?
为什么要这样做?我估计是大家被BUG吓怕了,生怕生产环境出现各种莫名其妙的错误,比如最经典的NullReferenceException,可问题是你用Try...Catch包裹起来后错误是不会爆出来了,但是执行结果是你想要的么?恐怕bug还在那里,只是经过你的Try...Catch之后,bug更加难找了,原本你用vs调试起来,直接就断在了异常发生的地方,现在呢?你得一步步跟踪过去。
这不是最主要的问题,最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个Try...Catch,恐怕你早就发现这个bug了,因为程序压根就跑不下去。
异常信息应该由最上层的框架捕获,比如MVC中有ExceptionFilter,你可以在这里记录详细日志,别把黄页抛给用户就可以了。我想写一个Try...Catch的场景,但是居然一下子想不出来一个很好的场景,因为真真需要写Try...Catch的场景是很少的,你一旦想写Try...Catch,首先想想你是不是在故意隐瞒Bug.
反而我鼓励大家写Throw exception,比如这种场景:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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为例:
-
Winform,可以:
AppDomain.CurrentDomain.UnhandledException +=new UnhandledExceptionEventHandler(UnhandledExceptionFunction);
- Asp.net,可以在Application_Error()方法里捕获异常
- MVC,可以写ExceptionFilter
- WebApi,可以写ExceptionHandler
这里面拿到的Exception都是带整个Stack记录的,你可以用Log4记录下来,并不是有的同学说的只会拿到e.message这样
建议:少写Try...Catch,喜欢写Try...Catch的朋友注意:你那90%的Try...Catch都是在坑队友
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)