你写的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,比如这种场景:
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都是在坑队友
你写的Try...Catch真的有必要么?的更多相关文章
- SQL Server中事务transaction如果没写在try catch中,就算中间语句报错还是会提交
假如我们数据库中有两张表Person和Book Person表: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, [CreateTi ...
- Core 1.0中的管道-中间件模式
ASP.NET Core 1.0中的管道-中间件模式 SP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middlewar ...
- python异常处理和断言
http://blog.csdn.net/pipisorry/article/details/21841883 关于异常处理有必要么的讨论 最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个 ...
- (69)Python异常处理与断言
http://blog.csdn.net/pipisorry/article/details/21841883 断言 断言是一句必须等价于布尔真的判定;此外,发生异常也意味着表达式为假.这些工作类似于 ...
- 你写的return null正确吗?
上次一篇“你写的try…catch真的有必要吗”引起了很多朋友的讨论.本次我在code review又发现了一个问题,那就是有人有意无意的写出了return null这样的代码,例如: public ...
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...
- zf-关于分页必写的代码
1 存储过程 ALTER PROCEDURE [dbo].[getStatForXXGKWeb] ), ), ), @page int, -- 必写的 @pageRows int,-- 必写的 @al ...
- 前端魔法堂——异常不仅仅是try/catch
前言 编程时我们往往拿到的是业务流程正确的业务说明文档或规范,但实际开发中却布满荆棘和例外情况,而这些例外中包含业务用例的例外,也包含技术上的例外.对于业务用例的例外我们别无它法,必须要求实施人员与 ...
- (后端)异常不仅仅是try/catch
前言 编程时我们往往拿到的是业务流程正确的业务说明文档或规范,但实际开发中却布满荆棘和例外情况,而这些例外中包含业务用例的例外,也包含技术上的例外.对于业务用例的例外我们别无它法,必须要求实施人员与 ...
随机推荐
- WebGL入门教程(三)-webgl动画
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL动画有移动.旋转和缩放,我们将移动.旋转和缩放图形,然后将其绘制到屏幕上,称为变换(tr ...
- CC2530使用串口下载(SBL)
工作环境: WIN7 64位 IAR 版本: 8.10.3 (8.10.3.10338) ZStack-CC2530-2.3.1-1.4.0协议栈,下载地址:http://download.csdn. ...
- js整理5
proto 每个对象具有的属性,指向构造该对象的构造函数的原型对象 prototype 函数的特有属性,指向原型对象:原型对象可以是对象,数组,函数等类型: constructor 原型对象和实例,都 ...
- 一、PID控制原理
在模拟控制系统中,控制器最常用的控制规律是PID控制.模拟PID控制系统原理框图如下图.系统由模拟PID控制器和被控对象组成. PID控制器是一种线性控制器,它根据给定值Yd(t)与实际输出值Y(t) ...
- myeclipse 无法启动
1.对项目中的一个文件重新命名,导致卡死,结束myeclipse进程不管用,重启不管用. 删除工程下的文件 以 .markers.snap 和 marker开头的两个文件 位置: 工作空间\ ...
- Python2 新手 编码问题 吐血总结
什么是编码 任何一种语言.文字.符号等等,计算都是将其以一种类似字典的形式存起来的,比如最早的计算机系统将英文文字转为数字存储(ASCII码),这种文字与数字(或其他)一一对应的关系我们称之为编码.由 ...
- swift-func(函数)
函数是一个组织在一起语句集合,以执行特定任务. Swift 函数类似于简单 C 函数以及复杂的 Objective C 语言函数. 它使我们能够通过函数调用内部的局部和全局参数值. 像其他任何语言一样 ...
- Django 中related_name,"%(app_label)s_%(class)s_related"
先看个model from django.db import models # Create your models here. class Parent(models.Model): name = ...
- centos7 搭建nginx和tomcat集成
一.安装jdk 1.yum install jdk 2.安装好了之后配置环境变量 在/etc/profile 二.创建项目运行目录 1. 我放在home目录 mkdir /web/webapps ...
- SQL基本语句汇总
语句:CREATE TABLE 作用:创建表格 格式:CREATE TABLE tableName (columnName1 columnDataType1, columnName2 columnDa ...