知用网
柔彩主题三 · 更轻盈的阅读体验

异常处理中的try catch用法详解

发布时间:2025-12-12 03:28:29 阅读:490 次

写程序时,谁还没遇到过几个报错?比如读文件发现文件不存在,或者网络请求突然断了。这些意外情况就是“ref="/tag/153/" style="color:#643D3D;font-weight:bold;">异常”,不处理好,程序直接崩溃。这时候就得靠 try catch 来兜底。

什么是异常类

在编程里,异常也是一个对象,属于某个异常类。比如 Java 里的 IOExceptionNullPointerException,Python 中的 FileNotFoundErrorValueError。每种异常对应不同的出错场景,系统抛出异常时,会生成一个该类的实例。

你可以把异常类看成是“错误说明书”,不仅告诉你哪里错了,还可能附带错误信息,比如文件路径找不到的具体位置。

try catch 怎么用

try catch 就是用来捕获并处理异常的结构。把可能出问题的代码放进 try 块里,一旦出错,就跳到对应的 catch 块处理,而不是直接退出程序。

以 Java 为例:

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("不能除以零:" + e.getMessage());
}

上面这段代码,除以零会触发 ArithmeticException,catch 捕获后打印提示,程序继续运行,不会崩。

多个异常怎么处理

一段代码可能引发多种异常,可以写多个 catch 分别处理。

try {
    int[] arr = new int[5];
    arr[10] = 100; // 数组越界
    Object obj = null;
    obj.toString(); // 空指针
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组下标越界:" + e.getMessage());
} catch (NullPointerException e) {
    System.out.println("空指针异常:" + e.getMessage());
}

注意顺序:子类异常在前,父类在后。否则编译器会报错,因为父类会“挡住”子类的捕获机会。

finally 干啥用

有时候不管出不出错,都想执行一段代码,比如关闭文件、释放资源。这时可以用 finally。

FileInputStream fis = null;
try {
    fis = new FileInputStream("data.txt");
    // 读取操作
} catch (FileNotFoundException e) {
    System.out.println("文件没找到:" + e.getMessage());
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            System.out.println("关闭文件失败:" + e.getMessage());
        }
    }
}

finally 里的代码总会执行,适合做清理工作。当然现在更多推荐用 try-with-resources,自动管理资源。

别滥用 try catch

不是所有地方都得包一层 try catch。比如明知道某个参数不该为空,就应该提前校验,而不是等它抛出 NullPointerException 再去抓。过度使用会让代码变得臃肿,掩盖真正的逻辑问题。

还有些人把整个 main 方法都包进 try,只为了不让程序退出。这就像给破车贴创可贴——表面没事,里头早就烂了。

自定义异常类

系统提供的异常不够用怎么办?可以自己写异常类。比如开发银行转账功能,可以定义一个 InsufficientBalanceException

class InsufficientBalanceException extends Exception {
    public InsufficientBalanceException(String message) {
        super(message);
    }
}

// 使用
try {
    if (balance < amount) {
        throw new InsufficientBalanceException("余额不足");
    }
} catch (InsufficientBalanceException e) {
    System.out.println(e.getMessage());
}

这样业务逻辑更清晰,别人一看就知道发生了什么。

异常处理不是为了消灭报错,而是让程序更有韧性。写代码时多想想“万一”,比出事后再补救强得多。