对于如下场景,给出不同的看法:

其实我更多的疑问在于,自定义的方法里面java api抛出了异常,这个时候,我是需要捕获呢?还是我也继续往上抛。

比如,我这里定义了一个日期处理的方法,有两种对异常的处理方式,

1、使用throws继续向上抛出异常:

public static Date convertStringToDate(String dateString, String format) throws ParseException{
if (org.springframework.util.StringUtils.isEmpty(format)) {
format = "yyyy-MM-dd HH:mm:ss";
}
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.parse(dateString);
}

2、自己捕获异常

public static Date convertStringToDate(String dateString, String format) {
if (org.springframework.util.StringUtils.isEmpty(format)) {
format = "yyyy-MM-dd HH:mm:ss";
}
SimpleDateFormat sdf = new SimpleDateFormat(format);
try {
return sdf.parse(dateString);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}

请问,哪种方式,更好一些呢?
看法一:
     我倾向于向上抛出异常,因为你这个方法里面的参数是调用者提供的,如果传入的日期有问题,应该让调用者知道,并且捕获进行进一步的处理。比如,如果这个日
期是用户设定的,就要通知用户重新设定,如果这个日期是其他输入源提供,就要有一个替代的日期作为标识,表明这个原本输入的日期是错的。

看法二:

  对于你这两种方法我有个人看法。

1、继续向上抛出异常:

2、自己捕获异常

如果你的第一种方法里。传入开始日期和结束日期。分别操作这两个参数都有可能出现异常。
像你这第一种方法抛出,那调用者怎么区分是哪一个日期出了问题呢?
你有没有自己想过自己捕获异常之后再抛给调用者呢?
就像你一个方法里,
操作开始日期报错了。catch到Exception里给一个retMsg做区分是开始日期不正确
操作结束日期报错了。catch到Exception里给一个retMsg做区分是结束日期不正确
再将这个具体的Exception抛给调用者。反馈给用户岂不是更加明确了。

看法三:

try catch一般在最上层使用,底层的都使用throws向上抛出。如果即在最上层做try catch,又在底层方法做try catch,程序
会变的很混乱。一般可预见的错误,比如空指针,你完全可以在最上层比如controller层进行判断下,不要让null进入底层方法引起不必要的麻烦,
你也省的给底层和上层方法都加预防空指针异常的判断。

看法四:

首先要理解异常到底是个什么

异常其实是程序运行过程中无法预料的事件(这里指非RuntimeException),一旦出现这些事件,你必须要进行处理。比如正在访问 数据库时,
数据库服务器当机,导致你的业务被中断。这种情况下,你的系统至少必须要告诉明确地用户这次业务操作是失败的,而在后台中,应该留下错误日志,以便排除故
障时留下线索。

如何处理异常,这和你的系统设计方案有关

以三层架构(表现层、业务逻辑层、数据访问层)和前面说的数据库访问失败为例,在你的数据访问层提供了方法:

getXXX();
getYYY();

updateXXX(XXX data);
updateYYY(YYY data);
……

对异常的处理你可以

1、在你的数据访问层捕捉异常,如果是 getXXX 方法出现异常,返回null,如果是updateXXX 方法出现异常,返回false,在数据访问层记录事务日志,逻辑层根据数据访问层的返回值进行逻辑处理

2、在数据访问层声明抛出异常,由逻辑层进行统一捕捉,并记录错误日志。同样通过返回值,让表现层来决定提供哪些信息给用户

3、其它方式我不常用,当然系统设计也不会只有三层设计一种方式,就不说了

异常处理是一种策略,一旦确定,则应该进行统一规范,不能让各个程序员过于自由发挥

其他看法:
  向上抛,快到前台的时候把控下。

如果知道可能会出错的异常类型,就try catch,并做出相应的处理。。
如果无法预测。。直接throws..

异常处理最忌讳的就是catch后不处理,直接打印一句e.printStackTrace() 这样如果有问题就会隐藏掉,内部的方法调用的时候可以往上抛异常 
例如,dao层一个抛给service层,service层再抛给Controller层,Controller层就不要再抛了

这里记录一下,方便以后查看。
来自于http://bbs.csdn.net/topics/391990528

java try catch 与 throws 使用场景以及怎么合理使用?的更多相关文章

  1. Java 异常处理 try catch finally throws throw 的使用和解读(一)

    //最近的一个内部表决系统开发过程中,//发现对异常处理还存在一些模棱两可的地方,//所以想着整理一下//主要涉及到://1.try catch finally throws throw 的使用和解读 ...

  2. 【Java】异常 —— throw, throws, try catch 相关内容

    嗯……面试考到了这个,又是一个如无意外 那么接下来就总结吧 一.什么是异常 程序运行过程中发生的异常事件. RuntimeException通常是因为编程员因为疏忽没有检查而引起的错误. 二.Exce ...

  3. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  4. Java中的引用类型和使用场景

    作者:Grey 原文地址:Java中的引用类型和使用场景 Java中的引用类型有哪几种? Java中的引用类型分成强引用, 软引用, 弱引用, 虚引用. 强引用 没有引用指向这个对象,垃圾回收会回收 ...

  5. JVM 字节码(三)异常在字节码中的处理(catch 和 throws)

    JVM 字节码(三)异常在字节码中的处理(catch 和 throws) 在 ClassFile 中到底是如何处理异常的呢? 一.代码块异常 catch catch 中的异常代码块在异常是如何处理的呢 ...

  6. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

  7. java异常处理之throw, throws,try和catch

    转自 http://blog.csdn.net/zhouyong80/article/details/1907799  程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...

  8. java只使用try和finally不使用catch的原因和场景

    JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch. class X { private final Re ...

  9. Java CAS ABA问题发生的场景分析

    提到了CAS操作存在问题,就是在CAS之前A变成B又变回A,CAS还是能够设置成功的,什么场景下会出现这个问题呢?查了一些资料,发现在下面的两种情况下会出现ABA问题. 1.A最开始的内存地址是X,然 ...

随机推荐

  1. 阿里云centos7搭建php+nginx环境

    阿里云Centos搭建lnmp(php7.1+nginx+mysql5.7) https://jingyan.baidu.com/article/215817f7a10bfb1eda14238b.ht ...

  2. centos 时区正确,时间不对

    centos6.5 里面 时区是 Asia/Shanghai ,但是 时间还是不对,在网上收集了如下做法:好像恢复了~~ (主要过程是:  查看各种设置,然后设置时间,最后更新本机时间,最后保持与时间 ...

  3. CentOS 7 巨大变动之 systemd 取代 SysV的Init

    1 systemd是什么 首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序.   ...

  4. LyX中文配置

    环境:OS X 10.9; MacTeX-2014; LyX Version 2.1.0 LyX是一个“WYSIWYM”(What You See Is What You Mean)的文字排版系统.其 ...

  5. Vue:实践学习笔记(1)——快速使用

    Vue:实践学习笔记(1)——快速使用 Vue基础知识 0.引入Vue 官方地址:Vue的官方下载地址 Vue推荐博客:keepfool 在你的程序中快速引入Vue: <!-- 开发环境版本,包 ...

  6. Java基础教程:多线程基础(1)——基础操作

    Java:多线程基础(1) 实现多线程的两种方式 1.继承Thread类 public class myThread extends Thread { /** * 继承Thread类,重写RUN方法. ...

  7. Spring Cloud之Feign客户端超时时间配置

    关于雪崩效应: 默认情况下tomcat只有一个线程去处理客户端发送的所有请求.高并发情况下,如果客户端请求都在同一接口,tomcat的所有线程池去处理,导致其他接口服务访问不了,等待. Tomcat有 ...

  8. 算法(Algorithms)第4版 练习 2.2.11(3)

    关键代码实现: public static void sort(Comparable[] input) { int N = input.length; aux = input.clone();//mu ...

  9. spring boot项目启动报(No session repository could be auto-configured, check your configuration (session store type is 'null'))

    找到项目的application配置文件,增加 spring.session.store-type=none,重新启动问题解决 注:因为项目未使用redis管理session,可以如上设置,如果想使用 ...

  10. Runtime Error(ACCESS_VIOLATION)

    1.     while(scanf("%d",&n) )// 错误,会出现  Runtime Error(ACCESS_VIOLATION) while(scanf(&q ...