赞
踩
- #include <iostream>
- void func(int a, int b)
- {
- if(b == 0)
- {
- throw "除0异常, b不能为0";
- }
- std::cout << "a / b = " << a / b << std::endl;
- }
- int main()
- {
- try
- {
- func(1,0);
- }
- catch(const char* error)
- {
- std::cout << error << std::endl;
- }
- catch(...) // 捕捉未知异常
- {
- std::cout << "Unknown" << std::endl;
- }
-
- std::cout << "END" << std::endl;
-
- return 0;
- }
try:内部代码块为可能出错的代码块
except:捕获try代码块中的异常,后跟可能出现的异常,Exception为所有异常,通常放在最后一个except中,保证所有异常都会被捕获
else:表示没有异常出现,执行的代码块
finally:表示无论是否发生异常都会执行的代码块,通常用于执行必要的资源处理:文件描述符的关闭、网络连接的关闭、数据库连接的关闭。避免资源泄露
- try:
- # 执行过程中可能出错的代码块
- print('try...')
- n = 10
- n = n / 1
- print('result is %d' % n)
- except ZeroDivisionError as e: # 捕获指定异常
- print('except is', e)
- except Exception as total: # 捕获所有异常
- print('except = ', total)
- else: # 表示无异常做的事情(可以没有)
- print('No Exception')
- finally: # 表示无论是否发生异常都会执行的代码块(可以没有)
- print('finally...')
- print('END')
【注】:
Python中的异常,都是一个个的类,继承于BaseException这个基类(Exception也是继承的BaseException),所以捕获基类异常时,会将所有子类异常都捕获到。
常见的异常类型与继承关系:
Built-in Exceptions — Python 3.12.4 documentation
在我们不主动捕获异常的时候,Python解释器会将这个异常捕获,并将错误信息打印在显示器上,如下:
- def fun1():
- n = 10
- n = n / 0
-
-
- def fun2():
- fun1()
-
-
- def main():
- fun2()
-
-
- main()
在Python中可以使用logging模块,在捕获异常中使用,来将Python解释器原本打印在显示器上的错误信息记录到logging中,捕获到异常后,将错误信息与异常一并输出,继续向后执行,最后正常退出
- import logging
-
-
- def fun1():
- n = 10
- n = n / 0
-
-
- def fun2():
- fun1()
-
-
- def main():
- fun2()
-
-
- try:
- main()
- except Exception as e:
- logging.exception(e)
- print('END')
在测试时,
logging
模块的输出顺序可能不同,原因主要在于它们的缓冲机制和输出流的处理方式。logging
模块在默认情况下会立即将日志信息输出。
- import logging
-
-
- def fun1():
- n = 10
- n = n / 0
-
-
- a = 1
- try:
- a = 2
- fun1()
- except Exception as e:
- logging.exception(e)
- print('END a =', a)
这里想说的就是,不要认为是程序执行顺序的问题,代码中a很好的验证了,程序永远都是自顶向下执行的
在Python中所有的异常类型都是一个个的类,所有我们也可以通过继承的方式来自定义一个异常类型,再使用raise来主动抛出异常。
但自定义异常类型只在必需时使用,其它情况建议使用内置的异常类型即可
- class FooError(ValueError):
- pass
-
-
- def foo(s):
- n = int(s)
- if n == 0:
- raise FooError('value is zero')
- return 10 / n
-
-
- foo('0')
主要用于一些函数内部有文件资源的使用、网络连接的使用、数据库资源的使用,不对异常做处理,而是关闭这些资源,再将异常重新抛出给外层,让外层对异常做处理
- def foo(s):
- n = int(s)
- if n == 0:
- raise ZeroDivisionError('此时n为0,是不被允许的')
- return 10 / n
-
-
- def bar():
- try:
- foo('0')
- except ZeroDivisionError as e:
- print('except ValueError')
- raise
-
-
- try:
- bar()
- except ZeroDivisionError as e:
- print('真正处理: ', e)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。