捕获异常

Python
try:
  process_1()
except IndexError as e:  # IndexError为特殊定义之一
  print(e)
except Exception as e:  # Exception为万能定义,置于最后
  print(e)
else:  # Python支持这种写法,主代码块执行完,执行该块
  process_2()
finally:  # 无论异常与否,最终执行该块
  process_3()
Java
try {
    process();
} catch (IOException | NumberFormatException e) {
    System.out.println(e); //一个catch语句可以匹配多个非继承关系的异常
} catch (Exception e) {
    System.out.println(e); //也需要注意顺序,子类必须写在前面
    System.out.println("Unknown error");
} finally {
    System.out.println("END");
}

抛出异常和自定义异常

Python
class MyCustomException(Exception):  # 自定义异常

    def __init__(self, msg):
        self.message = msg
    
    def __str__(self):
        return self.message

try:
    raise MyCustomException('我的问题')  # 主动抛出异常
except MyCustomException as e:
    print(e)

Java自定义异常类应该继承自Exception类或者从Exception派生的任何子类。

Java
// 检查型异常
public class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message); //将错误消息传递给父类,当自定义异常被抛出时,它会包含这个消息,然后可以通过捕获异常后调用方法getMessage()来获取这个消息
    }    
    // 可以添加额外的构造函数、方法或字段,下同
}

如果想要创建一个非检查型异常,可以继承RuntimeException

Java
// 非检查型异常
public class MyCustomRuntimeException extends RuntimeException {
    public MyCustomRuntimeException(String message) {
        super(message);
    }
}

使用throw关键字和自定义异常类的一个实例:

Java
public class Test {
    public void doSomething() throws MyCustomException {
        // 当检测到某种条件时抛出异常
        if (somethingGoesWrong) {
            throw new MyCustomException("出错啦!");
        }
    }
}

如果当前方法没有捕获异常(比如上面这个例子),异常就会被抛到上层调用方法,直到遇到某个try ... catch被捕获为止。