java中如何一次抛出多个异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何一次抛出多个异常相关的知识,希望对你有一定的参考价值。

  基本思路就是定义三个类,继承异常的父类,然后在需要抛出异常的地方,throws一下就可以了,示例如下:

public class CatchMultiException 
 
    public static void main(String[] args) throws Exception 
        try 
            test(2);
         catch (Exception e) 
            if (e instanceof TestAException || e instanceof TestBException
                    || e instanceof TestCException) 
                e.printStackTrace();
             else 
                throw e;
            
        
    
 
    public static void test(int a) throws TestAException, TestBException,
            TestCException 
        if (a == 0) 
            throw new TestAException();//抛出第一个异常
        
        if (a == 1) 
            throw new TestBException();//抛出第二个异常
        
        if (a == 2) 
            throw new TestCException();//抛出第三个异常
        
    

 
class TestAException extends Exception //继承父类Exception
    private static final long serialVersionUID = 1L;

 
class TestBException extends Exception 
    private static final long serialVersionUID = 1L;

 
class TestCException extends Exception 
    private static final long serialVersionUID = 1L;
参考技术A 方法修饰符 返回值 方法名(参数) throws Exception

/*里面自己定义异常*/

可以抛出多个异常,但是不能一次抛出,
一次抛出多个异常的就相当于一个方法一次返回多个返回值,
答案就是---------怎么可能呢?!当然不行嘞!!!嘿嘿,别乱想了....
参考技术B 从小到大排列到try catch里,不过只能抛出最小的那个。。 参考技术C 直接throws异常,有几个写几个 正解!本回答被提问者采纳 参考技术D 直接throws异常,有几个写几个

在java中捕获所有抛出的异常?

【中文标题】在java中捕获所有抛出的异常?【英文标题】:Capture all thrown exceptions in java? 【发布时间】:2014-08-22 16:09:01 【问题描述】:

我怀疑这样的事情是可能的,但是如果不将调试器附加到 java 应用程序,是否有可能在一些集合中填充有关 java 应用程序中生成的每个异常的信息,无论它是否被捕获?我知道在 .NET 中,应用程序会生成有关异常的消息,此时称为“第一次机会异常”,这些异常可能随后由应用程序处理,也可能不处理。我想知道 java 中是否有类似的机制,我可以利用它来查看有关在运行时生成的所有异常的信息。

只是为了澄清。这与发生异常的上下文无关。这个问题与我在 catch 块中所做的事情或未处理的异常无关。它是关于了解 JVM 是否提供了一种机制来查看运行时生成的每个异常,而不管它是由什么生成的,或者是上下文。

【问题讨论】:

为什么不想捕获异常?如果它被捕获只需将堆栈跟踪添加到 log4j 或类似的东西? 我们有一个客户,他一直认为他可以从我们的应用程序生成的完整异常列表中获取有意义的信息,无论它们是否未处理。我们还希望避免重构大部分代码库以执行您建议的操作,并在每个 try 语句中捕获异常数据。 也许这有帮助:***.com/questions/23561555/… 你的客户被骗了。归根结底,此类技术细节不应成为您客户的关注点。 顺便说一句,接受的答案不是很准确。它拦截异常构造,但不拦截异常抛出。并非所有构造的异常都被抛出,也不是所有抛出的异常都被构造。 【参考方案1】:

为什么不呢,当然有可能!但首先.. 记录 JVM 遇到的所有异常是浪费生命。它在任何意义上都没有意义,可能会抛出几个没有任何意义的异常。

但如果你确实别无选择,你可以调整你的 Java 来做到这一点。

打破良好编程的每一条规则,我们为之而活,我给你这个想法:

    java.lang.Exception的源代码从JDK源复制到你的项目中。

    在您的 Exception.java 中创建一个方法,如下所示:

    private void logException() 
        // Your logging routine here.
    
    

    编辑 java.lang.Exception 以在每个构造函数的末尾调用此方法 logException()

    将新的 java.lang.Exception 添加到 bootstrap 类路径。

    设置您的日志记录级别等并运行

抬起你的头,把这个展示给你奇怪的客户,使用你的外交技巧并用几句话吓唬他们'我们可以做到......但风险自负'。你可能会说服他不要使用这个。

【讨论】:

这个我试过了,我想应该还不错,还有一个问题,做完这样的事情感觉很脏是正常的吗? 是的,完全是。这是进行反演示的最佳方法之一。开个玩笑,这样做会破坏经过良好测试的产品的一致性,严重损害并发性,在没有详尽系统测试的情况下增加未经测试的代码的影响(不仅是您的代码,JVM 也是如此),并且可能有很多事情我太困了想想,晚安。

以上是关于java中如何一次抛出多个异常的主要内容,如果未能解决你的问题,请参考以下文章

如何实现二次抛异常时保存第一次异常的详细信息?

如何使用 Mockery 在模拟方法的第 N 次调用中引发异常

如何识别抛出的特定异常

C# 中如何一次 catch 多个异常?

java中 在一个异常处理中啥语句块是可多个的

java中如何抛出异常后继续运行