在catch里再次throw出去一个异常,这种写法有什么用?如果需要将异常向上抛,那么在方法的后面直接throws不就好了吗?
请大牛们详细的解释下
或者说这种写法好不好呢?
个人的看法是偏向不好,请指教

解决方案 »

  1.   

    以下是网上对这个问题的看法,我实在是不太明白,请大牛们看看,这种观点是不是对的:如果说我一个业务逻辑比较复杂,并且,在不同的逻辑层中要做不一样的操作,就得这样,简单举例吧。
    我要执行一个删除的sql语句(实际这个语句是有问题的)
    在DAO层,先捕捉一次,打印错误的sql语句,
    (业务上,如果执行错误,就走另一条业务路线),那么继续抛出异常
    在逻辑层上继续捕获,做别的操作
      

  2.   


    封装自己的异常类我知道,可是如果需要抛出自己的异常类,catch后的参数上写上不就可以了吗?干嘛要在catch里额外throw出来呢?
      

  3.   

    throw new Exception("xxoo....")
      

  4.   

     有用 确实有用 我的willow库就这样用过 
      

  5.   

    当然有用。比如自己定义很多业务异常类。。当你的问题是属性业务逻辑,或者数据不对时,catch以后,抛出你的业务异常,在上一层进行捕获,进行不同的处理
      

  6.   

    用处是,在实现自身异常处理的同时告知调用方此异常的发生,并允许调用方可以捕获和处理此异常这可以将每一层的异常处理分层整合。处理有没有用可能得根据情况所定吧比如说一套lib有自己的logger,那在自己的catch中以自己的方式log异常,之后也需要通知调用者此处出现异常,所以throw给调用方
      

  7.   

    1:记录一下日志
    2:将 checked 异常包装成 unchecked 异常其他我也想不出有什么原因了。
      

  8.   

    抛出异常机制是这样:比如说你在业务层的catch里面throw这样写:throw new Exception(“您的权限不够”);然后在最上层(就是UI层)直接这样
    try{}catch(Exception ex){
    MessageBox.Show(ex.Message);}
    就行了,不必去管这个ex的消息是什么,异常机制本来就是底层抛出,上层捕获的,只不过现在不用你自己去根据不同类型异常去写异常信息了。
    ps:这是我自己的理解,仅供参考
      

  9.   

    throw在 java中是关于异常的操作.
    首先异常在java中的意思是: 一些可以导致程序出问题的因素,比如书写错误,逻辑错误或者是api的应用错误等等. 为了防止程序的崩溃就要预先检测这些因素,所以java 使用了异常这个机制.
    在java中异常是靠 "抛出" 也就是英语的"throw" 来使用的,意思是如果发现到什么异常的时候就把错误信息 "抛出",
    throw写在方法体内 
    throws写在方法名的后面 
    两个都是用于抛出异常 
      

  10.   

    catch(Exception e)
    {
      throw new MyException("抛出我自己的异常");
    }括号里面是说你要捕获哪个异常大括号里面的throw是说你捕获到了异常,准备怎么抛出。是跑出捕获的异常,还是抛出其他异常等等。
      

  11.   

     throw是指抛出的一个具体的异常类型。
    通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
    throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
    throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后再将包装后的异常信息抛出。
    对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而cathch的范围又要大于throws的Exception的范围;throw 主动抛出自定义异常类对象. throws抛出的是类,throw抛出的是对象. 
    在方法定义中表示的是陈述语气,第三人称单数,throw 显然要加s。(throws 一般用作方法定义的子句)
    在函数体中要用throw,实际上是祈使句+强调,等价于DO throw ....,do +动词原形throw 用于引发异常,可引发预定义异常和自定义异常
      

  12.   

    在catch里再次throw出去一个异常,我觉得这种情况可能会用到:
    自己写一套API,API中某些方法是需要捕获异常的,在封装好的API中catch一次,做一些处理。
    但是这样用户在调用这个方法的时候,就不需要捕获了,但是此方法是有可能出异常的,而用户却不能在异常出现时进行处理。所以,在catch处需要再次throw一次异常,这样,用户也就可以进行一些异常处理了。
    也可以这样作比喻,不知道合不合理:
    如果在catch里不throw,那么就好比把捕获异常的权利私有化了(private),用户调用时,无权捕获;
    而在catch里再次throw异常,那么好比将捕获异常的权利公有化了(public),可以供用户使用。
      

  13.   

    在catch里再次throw出去一个异常,我觉得这种情况可能会用到:
    自己写一套API,API中某些方法是需要捕获异常的,在封装好的API中catch一次,做一些处理。
    但是这样用户在调用这个方法的时候,就不需要捕获了,但是此方法是有可能出异常的,而用户却不能在异常出现时进行处理。所以,在catch处需要再次throw一次异常,这样,用户也就可以进行一些异常处理了。
    也可以这样作比喻,不知道合不合理:
    如果在catch里不throw,那么就好比把捕获异常的权利私有化了(private),用户调用时,无权捕获;
    而在catch里再次throw异常,那么好比将捕获异常的权利公有化了(public),可以供用户使用。
      

  14.   

    在catch里再次throw出去一个异常,我觉得这种情况可能会用到:
    自己写一套API,API中某些方法是需要捕获异常的,在封装好的API中catch一次,做一些处理。
    但是这样用户在调用这个方法的时候,就不需要捕获了,但是此方法是有可能出异常的,而用户却不能在异常出现时进行处理。所以,在catch处需要再次throw一次异常,这样,用户也就可以进行一些异常处理了。
    也可以这样作比喻,不知道合不合理:
    如果在catch里不throw,那么就好比把捕获异常的权利私有化了(private),用户调用时,无权捕获;
    而在catch里再次throw异常,那么好比将捕获异常的权利公有化了(public),可以供用户使用。
      

  15.   

    用于抛出用户容易理解的异常而不是底层的异常。这个在spring体现得淋漓尽致。例如,如果系统使用hibernate,ibatis,jdbc中的某一种,那么他们抛出的数据库异常信息就各不相同,如果客户或开发员只熟悉其中一种,那其他两种的异常就很难看懂,spring把这三种数据库连接可能抛出的异常,重新统一封装了,那么,我们只要了解spring的异常信息就可以了,不需要关心底层用的是哪种ORM,即使换成我们不熟悉的也没关系。
      

  16.   


    受教了,还没研究过spring的源码,看来得抽时间看看了
      

  17.   


    不是这样的,catch到的可能是sun提供的,比如越界异常
    但是我可以在后面抛出一个我自定义的异常,比如告诉用户,是在a模块的输入异常。
    如果在另外一个地方也有越界异常,我可能抛出的是b模块输入异常。
    --------------------
    http://www.qinglobo.com/list-6.htm
      

  18.   

    有用!比如Socket的时候。为了节省资源限制Socket线程的最长连接是10分钟。如果10分钟内这个Socket请求还不处理完毕就限制关闭Socket.public void run() {
    timer.schedule(new MyTimeOutTask(),threadTimeOut);
    out.println("200 ESMTP Service ready");
    try {
    while(true){
    String line=in.readLine();

    if(line==null) break;
    if(line.equalsIgnoreCase("QUIT")){
    out.println("221 Bye");
    break;
    }else if(line.equalsIgnoreCase("NOOP")){
    out.println("200 OK");
    }
    System.out.println("client say:"+line);
    }
    } catch(SocketTimeoutException e){
    System.out.println("ERROR : Read timed out");
    //e.printStackTrace();
    }catch(SocketException e){
    if(isTimeOut){
    throw new TimeOutException("运行超时!");
                                    //System.out.println("超过连接的最长限制!");
    }else{
    e.printStackTrace();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }finally{
    timer.cancel();
    timer=null;
    close();
    }
    }
    在线程超时的时候强行关闭Socket则 while中 的in.readLine();会抛出SocketException 不会抛出TimeOutException ..所以在 SocketException的catch里判断是不是超时(isTimeOut=true)是则抛出TimeOutException 不是就处理SocketException
      

  19.   

    因为在SocketException 块中并不知道是网络原因关闭的连接还是超时后强制关闭的连接。所以在SocketException块里判断是不是超时引起的异常。。是就抛出TimeOutException 。用于业务判断与处理。