捕获异常
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
被捕获为止。