几条建议:
   如果无法处理某个异常,那就不要捕获它。 
   如果捕获了一个异常,请不要胡乱处理它。 
   尽量在靠近异常被抛出的地方捕获异常。 
   在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。 
   按照您的异常处理必须多精细来构造您的方法。 
   需要用几种类型的异常就用几种,尤其是对于应用程序异常。
   把低层次的异常封装成层次较高程序员较容易理解的异常。
   尽量输出造成异常的完整数据
   尽量捕获具有特定含义的异常:比如SqlException,而不是简单地捕获一个Exception。

  如果你的程序不是对效率苛求得过分,我建议你宁可多使用一些异常也是好的。
注意:我说的多使用的意思不是让你全部trycatch起来,然后catch(Exception e)把所有的异常都屏蔽了;而是暂时不考虑trycatch可能带来的效率上的损失,而注重程序的稳定性。
至于如何优化trycatch的使用,慢慢来。就我个人的使用而言,影响其实不是很大。

1.       不要滥用Try…Catch一般来说只在最外层函数上才需要。因为该函数不能将Exception再往外抛了。所以需要Catch住做相应的处理,如显示Error Message。或转化为与调用模块约定好的Error Code。内部函数即使Catch住了Exception,也要往外抛,所以没有必要。

2.       为了使用Finally来保证资源的释放。如:

SqlConnection connection = null;

try

{

connection = new SqlConnection(ConnectionString);

connection.Open();

}

catch (Exception ex)

{

throw ex;

}

finally

{

if (connection != null && connection.State != ConnectionState.Closed)

{

connection.Close();

}

}

对这种情况Catch住的Exception直接往外抛,不做处理。需要注意的是这里使用Try…Catch不是唯一的办法,也可以使用using语句来保证资源的释放。

3.       为了保证函数有统一的出口。比如一个最外层的函数连续调用了一系列内部子函数,当其中某个子函数出错时, 跳到函数最后退出,对这种情况Catch住的Exception直接吃掉,因为在Try里面已经做了错误处理。如:

public Result OutMostFunction()

{

Result result = Result.Success;

try

{

try

{

SubFunction1();

}

catch (Exception ex)

{

result = Result.SubFunction_1_Error;

throw ex;

}

try

{

SubFunction2();

}

catch (Exception ex)

{

result = Result.SubFunction_2_Error;

throw ex;

}

try

{

SubFunction3();

}

catch (Exception ex)

{

result = Result.SubFunction_3_Error;

throw ex;

}

}

catch (Exception ex)

{

}

return result;

}

4.       为了区分程序错误与逻辑错误,需要自定义一个Exception类型。比如一个最外层函数调用一个密码验证子函数,就需要区分是因为密码错误(逻辑错误),还是在密码验证过程中程序出现了没有预料到的错误(程序错误)。如:

public class GoOutException : Exception {}

public Result OutMostFunction()

{

Result result = Result.Success;

try

{

try

{

if (!VerifyPassword(password))

{

result = Result.Invalid_Password;

throw new GoOutException();

}

}

catch (Exception ex)

{

if (!(ex is GoOutException))

{

result = Result.General_Error;

}

throw ex;

}

}

catch (Exception ex)

{

}

return result;

}

  1. 什么时候使用try catch语句模块,是不是没有明确的答案?
  2. 来自网友的回答:try catch是程序语言本身提供的一种异常处理机制,你大多数写的代码都是要调用底层的api,而这些api的作者在开发api时,很清楚api在使用的过程中会有哪些非正常情况发生,因此他要通知api的调用者,至于对于这种非正常情况怎么处理,就交给了api的调用者。
  3. 你是写代码的,你要调用api,因此你就说api的调用者,你也应该处理api本身存在的非正常情况,那你怎么处理这些非正常状况,这就是你提到的try catch的作用了,它就是干这事的。至于api会有哪些非正常情况发生,需要查api的帮助文档;这些非正常状况怎么处理,这又取决于问题逻辑了,跟实际需求有关系。
  4. try{A程序块} catch{Exception e}{B程序块} 。。。。。
  5. A程序块比较有可能会出错的地方,B则是如果A中有了错误,进行的处理。就好比,一个流水线上,如果有个地方有个产品堵住了不通了,如果没人处理,则整个流水线就没法动作了,要想保证整个流水线的运作则要有人把这个产品给处理了。try语句就是对A程序块的语句进行捕捉有可能出错的地方,相当于流水线上那个检查的人,catch语句则是处理的.
  6. 什么情况下需要用try-catch呢,那就是不使用这种try结构时,代码报错退出就无法继续执行。有的代码出错就应该退出,有的出错尚可以补救,就不应该退出。对于这种出错不应该退出的就需要使用这种结构,在catch中进行补救。例如,写入一个日志文件,如果这个日志文件被锁定或者占用,那么写入就会出错退出,但是我们并不想看到这样的情况,我们完全可以换一个名字再写入。
  7. 有的函数或者功能调用之后不会出错退出,但是会返回错误码,这个时候也不需要使用try-catch结构。直接根据不同的错误码进行分类处理就行了。
  8. 所以不是trycatch使用量的问题,还是看应用场景,如果确实需要防止异常退出,需要多次补救,那么再多都是不为过的。
  9. 还有一个情况要注意,try-catch不是能够解决所有的出错退出,例如php中的segment fault,也就是熟知的段错误,就算是try-catch了也还是会退出,这个时候需要使用gdb进行调试解决了。
  10. try catch后是不是一定要输出异常信息?或者有没有更好的办法去处理日志信息呢?
  11. 如果每一段程序都try catch后输出日志,会导致日志信息臃肿不堪,无法从日志中读取有用的信息,使得解决问题更加困难。那有没有统一处理日志信息的工具包呢!规划好日志信息,异常信息将更加清晰明了,同时多读日志可以不段优化程序减少异常的发生情况,一举多得何乐而不为!
  12. LOG4J学习
  13. 定义:Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
  14. 程序开发环境中的日志记录是由嵌入在程序中以输出一些对开发人员有用信息的语句所组成。例如,跟踪语句(trace),结构转储和常见的 System.out.println或printf调试语句。log4j提供分级方法在程序中嵌入日志记录语句。日志信息具有多种输出格式和多个输出级别。
  15. 使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本,因为日志记录可以通过配置脚本在运行时得以控制。 log4j维护嵌入在程序代码中的日志记录语句。通过规范日志记录的处理过程,一些人认为应该鼓励更多的使用日志记录并且获得更高程度的效率。
  16. 使用log4j大概涉及3个主要概念:
  17. 公共类 Logger Logger 负责处理日志记录的大部分操作。
  18. 公共接口 Appender Appender 负责控制日志记录操作的输出。
  19. 公共抽象类Layout Layout 负责格式化Appender的输出。

什么时候使用Try Catch(转)相关推荐

  1. C++中try/catch/throw的使用

    C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理.异常提供了一种转移程序控制权的方式.C++异常处理涉及到三个关 ...

  2. 前端try catch是如何捕获异常的_一文告诉你如何优雅处理前端异常?

    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人. 一.为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的 ...

  3. C#是否该支持“try/catch/else”语法

    以前用过一段时间Python,里面有个try/catch/else语法,我觉得挺好用,这个语法形如下: try:print('try...')r = 10 / int('2')print('resul ...

  4. aspx页面使用ajax遇到try catch中使用Response.End()报错

    1.使用Ajax接收数据,在返回Response.Write()后应该调用Response.End()才能将数据写入到调用的页面,才能被jQuery的回调函数获取到返回的JSON数据 2.在try-- ...

  5. (转)java 中的try catch finally 语句中含有return语句的执行情况(总结版)

    原处:http://blog.csdn.net/ns_code/article/details/17485221 在这里看到了try catch finally块中含有return语句时程序执行的几种 ...

  6. 异常处理机制(Begin try Begin Catch)

    begin try--SQL end trybegin catch --sql (处理出错动作)end catch 我们将可能会出错的sql 写在begin try...end try 之间,若出错, ...

  7. Matlab编程与数据类型 -- 出错处理语句try/catch/end

    本微信图文详细介绍了Matlab中try/catch/end出错处理语句.

  8. 为什么不建议用try catch处理异常?

    欢迎关注方志朋的博客,回复"666"获面试宝典 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量 ...

  9. 不要再满屏写 try...catch 了!这个更香!

    点击关注公众号,Java干货及时送达 来源:www.toutiao.com/i6878184496945070604 前言 软件开发springboot项目过程中,不可避免的需要处理各种异常,spri ...

  10. 公司这套架构统一处理 try...catch 这么香,求求你不要再满屏写了,再发现扣绩效!...

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:小李子说程序 www.toutiao.com/i68 ...

最新文章

  1. Json数据发布到Tomcat本地服务器
  2. 硬盘录像机和服务器,硬盘录像机和视频监控服务器
  3. 2019年如何打造自己的“前端品牌”
  4. cmake,make,nmake的用法
  5. 安卓模拟器安装过程记录 20200926
  6. webpack 分离css html,【已解决】ReactJS中Webpack打包时分离css
  7. 老人为啥怒砸30辆车
  8. moviepy图片和文字合成视频
  9. 调用讯飞开放平台的语音转写api
  10. HTML5绘制八大行星加入字体,html5中用canvas画八大行星围绕太阳转
  11. 基于java浏览器的设计与实现_基于java的浏览器的设计与实现论文.docx
  12. 利用java图形用户界面实现后台管理系统
  13. 爬虫软件尝试-后羿采集器:批量免费抓取网页数据
  14. 遍历字符串str1的所有非空子串
  15. 特权老师又一最新力作-Verilog边码边学 视频教程
  16. 虚拟存储器与虚拟内存
  17. 产品研发管理的系统解决方案
  18. 织梦PHP版本怎么更新,织梦DedeCMS系统如何打补丁升级
  19. I - The old Padawan Gym - 100285I——二分查找
  20. taglib指令标签的详细使用

热门文章

  1. 麻省理工学院最新研究,可穿戴传感器帮助渐冻人患者交流-1
  2. Dockerfile详解、镜像发布、网络详解学习
  3. 男士成功面试着装指南
  4. 票据打印, 银行账单打印, 标签印刷, 文档打印, 条码打印, 批量打印, 包装纸打印与设计,可变数据打印,数据库印刷,HMI报表打印,VC++源码库解决方案
  5. Excel Sheet Column
  6. 未加载的ntdll.pdb错误
  7. JAVA 阶段测试题-SQL
  8. SDF官网SDFormat 规范的一些截图
  9. Python-Anaconda 环境
  10. window中控制台cmd的快捷粘贴复制操作