如何处理多个异常

Posted

tags:

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

参考技术A 处理多个异常的方式:1、可以使用多个try...catch语句

                                  2、(提取共性)使用一个try和多个catch

Exception异常的父类:   

出现异常时,多个catch之间的顺序    :1,多个catch之间有子父类关系

                                                               2.平级之间没有顺序关系

                                                              3.如果有子父类,父类异常必须放在后面。         

public class ExceptionDemo3

public static void main(String[] args)

/*try

System.out.println(2/0);

catch (Exception e)

System.out.println("除数不能为0");



try

int[] c=new int[4];

System.out.println(c[4]);

catch (Exception e)

System.out.println("数组索引越界");

*/

try

String s=null;

System.out.println(s.length());

System.out.println(2/0);

int[] c=new int[4];

System.out.println(c[4]);

catch (ArithmeticException e)

System.out.println("除数不能为0");

catch (ArrayIndexOutOfBoundsException e)

System.out.println("数组索引越界");

catch(Exception e)

System.out.println("出现异常了");





C# 中的异常处理 - 如何处理?

【中文标题】C# 中的异常处理 - 如何处理?【英文标题】:Exception handling in C# - How? 【发布时间】:2011-06-05 06:09:53 【问题描述】:

使用 MODI(Microsoft Office Document Imaging)OCR,有时图像不包含任何文本。因此 doc.OCR 会抛出异常。

    public static string recognize(string filepath, MODI.MiLANGUAGES language = MODI.MiLANGUAGES.miLANG_RUSSIAN, bool straightenimage = true)
    
        if (!File.Exists(filepath)) return "error 1: File does not exist";
        MODI.Document doc = new MODI.Document();
        doc.Create(filepath);

        try
        
            doc.OCR(language, false, false);
        
        catch
        
            //
        
        MODI.Image image = (MODI.Image)doc.Images[0];

        string result="";
        foreach (MODI.Word worditems in image.Layout.Words)
        
            result += worditems.Text + ' ';
            if (worditems.Text[worditems.Text.Length - 1] == '?') break;
        


        doc.Close(false);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(image);
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(image);
        image = null;
        doc = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();

        return result;

    

这段代码终止了应用程序,而不是我需要的:(

我如何让它像什么都没发生一样消失?

【问题讨论】:

明确一点——你只是想忽略异常? 抛出了什么异常?你确定它是这个方法抛出的吗? 该代码看起来只是吞下了异常。我看不出它如何终止应用程序。是不是缺少一些代码? 显示的代码不应该终止应用程序 - 所以要么doc.OCR 在内部做了一些相当可怕的事情,要么有一些你没有向我们展示的上下文.. .? @Darin,是的,我确定 \\ @Tim,是的 【参考方案1】:

您发布的代码已经完成了 95%:

try

    doc.OCR(language, false, false);

catch

    // Here you would check the exception details
    // and decide if this is an exception you need
    // and want to handle or if it is an "acceptable"
    // error - at which point you could popup a message
    // box, write a log or doing something else

也就是说,谨慎的做法是捕获文档为空时发生的异常类型,然后为可能发生的任何其他错误使用不同的异常处理程序

try

    doc.OCR(language, false, false);

catch (DocumentEmptyException dex)


catch


我认为,DocumentEmptyException 不是抛出的异常类型 - 如果您查看 OCR 方法(或通过调试)的文档,您将能够确定要捕获的异常类型

编辑(看到您的编辑后)

您确定是从 doc.OCR(...) 方法抛出异常吗?在您的编辑中,您在 catch 之后添加了额外的代码,它可能来自那里吗?

比如catch后面的那一行:

MODI.Image image = (MODI.Image)doc.Images[0];

如果您的文档为空,因此抛出异常并被忽略(因为 catch 块中没有任何内容),此行是否继续工作?

【讨论】:

但是我想知道一件事。什么是异常类型?看图片 --> img89.imageshack.us/img89/8884/testnc.jpg 从屏幕截图看来,它抛出了一个通用的 com 异常,并带有一条描述错误的消息。可能值得检查异常是否包含包含更多详细信息的 InnerException【参考方案2】:

你在 catch 块中什么也没做,只是吞下了非常糟糕的异常。代码继续执行,您尝试使用 doc 变量,但由于 .OCR 调用失败,很可能稍后会引发另一个异常。例如,如果 OCR 失败,doc.Images[0] 可能会崩溃。所以要么通过返回一些东西来终止方法的执行,要么把整个方法放在一个 try/catch 块中。

【讨论】:

以上是关于如何处理多个异常的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的异常处理 - 如何处理?

java是如何处理异常的?

如何处理无效的异常处理程序例程?

JV默认是如何处理异常

spring mvc 异常如何处理

我们如何处理 bigquery 过程中的异常?