周末多码文,昨天晚上一篇,今天再来一篇:html
在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/masterpython
在线预览:http://github.lesschina.com/python/base/oop/3.异常相关.htmlgit
代码裤子:https://github.com/lotapp/BaseCode/tree/master/python/2.OOP/4.Exception程序员
def main():
try:
1 / 0 # ZeroDivisionError: division by zero
except ZeroDivisionError as ex:
print(ex)
if __name__ == '__main__':
main()
小潘同窗刚进来就看见了,自语道:“try...except
捕获异常谁不会?就会这么屁点东西还好意思秀,切~ 我给你把 格式补全”编程
因而乘着小明上厕所的时候,擦掉小明的Code,本身写了一段高大上的Code:app
# 异常捕获全格式
def test(input_str):
try:
eval(input_str)
except ZeroDivisionError as ex:
print("except:", ex)
else:
print("else:没有异常就奖励100块~")
finally:
print("finally:小明是傻子~")
def main():
test("1/0")
print("-" * 10)
test("print('小明啊小明你调坑里了~')")
if __name__ == '__main__':
main()
这时候小明和老师一块儿进来了,同窗们隐约间都听到小明的自诩声:“老师,我可好了,提早预习而且还写了个demo在黑板上呢~”less
老师一进门看着黑板就笑了,同窗们也笑成一片。小明心想,咦~难道我写错了?定眼一看黑板,气呼呼的回座位了编辑器
else
能够不写,不过咱们 基本上仍是会写的,毕竟能够知道是真的没有错误,而不是屏蔽了错误oop
老师很欣慰,以为这个班真有意思,你们学习空前热情,为了照顾小明,老师反问道:“有谁知道 多个异常怎么处理?”
小明飞快的举手并把黑板上内容擦完,写下了以下代码:
# 多个异常捕获
def main():
try:
print(xiaopan) # NameError: name 'xiaopan' is not defined
1 / 0 # ZeroDivisionError: division by zero
except NameError as ex:
print(ex)
except ZeroDivisionError as ex:
print(ex)
if __name__ == '__main__':
main()
老师问了小明一声,有几个输出?
小明骄傲的说道:“两个,我写了两个异常处理,固然都执行了”
同窗们又笑了,小潘调侃的说了句:“一看就知道去年C#没好好学,这不都同样嘛,遇到异常下面代码还执行吗?用脑子好好想一想”
当咱们认为某些代码可能会出错时,就能够用try
来运行这段代码,若是执行出错,则后续代码不会继续执行,而是直接跳转至except
语句块,执行完except
后,若是有finally
语句块,则执行finally语句块
小明又尴尬了。。。
老师再次帮小明圆了个场:“已经很不简单了,就是最后小得意的时候口误了,那小明同窗你知道Python里面多异常有个便捷写法吗?”
小明赶忙拿起粉笔刷刷刷的写完,而后说道:“of course”
# 多个异常捕获的简写(注意哦,是元组哦)
def main():
try:
print(xiaopan) # NameError: name 'xiaopan' is not defined
1 / 0 # ZeroDivisionError: division by zero
except (NameError, ZeroDivisionError) as ex:
print(ex)
if __name__ == '__main__':
main()
老师赶忙夸了夸小明,心想,哎呦喂终于把这难缠的家伙弄回座位了。
小明走前还不忘说一句:“简写的时候注意格式哦,是 元组 不是逗号分隔”
老师这堂课很轻松,你们都预习了并且内容也比较简单。
接着以提问的方式问道:“小潘同窗,你知道异常的基类是什么吗?若是要捕获全部异常该怎么作呢?”
小潘站起来讲道:“是BaseException
”
老师扩充道:“全部的错误类型都继承自BaseException
,因此在使用except
时须要注意的是,它不但捕获该类型的错误,还把其子类也一块儿捕获了”
因此通常在捕获异常的时候 把子类异常放在前面,父类放在后面
看以下代码:
def main():
try:
1 / 0 # ZeroDivisionError: division by zero
except BaseException as ex:
print("base:", ex)
except ZeroDivisionError as ex:
print(ex)
if __name__ == '__main__':
main()
若是把父类放第一个,那么ZeroDivisionError
永远也不会被执行了,其实你若是装了 代码规范提示插件会提示你的
能够参考我以前写的 vscode设置python3调试环境的扩充部分
来个通用异常捕获的简写(官方不推荐使用简写):
# 直接except就好了
def main():
try:
1 / 0
dnt += 1
except:
print("屏蔽错误")
if __name__ == '__main__':
main()
老师继续讲到,咱们来看一个场景,如今不少在线编辑器,你在他们那些编辑框里写下了代码也是有异常抛出的,这是怎么处理的呢?
微软有开源代码编辑器比较受欢迎(VSCode的一部分):monaco-editor
提示一下,若是真的要作在线编辑器,记得考虑一下fork炸弹
,这个其实也是很老的东西了,程序员基本上都应该接触过了
咱们继续,像C#是用thorw
抛出异常,那Python怎么 捕获异常后再抛出
呢?怎么自定义异常
呢?
继续往下看:
# 捕获异常后再丢出,eg:在线运行的用户Code
def main():
try:
1 / 0 # ZeroDivisionError: division by zero
except ZeroDivisionError as ex:
print(ex) # 写个日志,回头出问题能够深究
raise
if __name__ == '__main__':
main()
# 抛出自定义异常
class DntException(BaseException):
pass
def get_age(num):
if num <= 0:
raise DntException("num must>0")
else:
print(num)
def main():
get_age(-1)
get_age(22) # 程序崩了,这句话不会被执行了
if __name__ == '__main__':
main()
异常这一块基本上讲完了(logging
模块后面会说)有什么补充的能够说的^_^
小明又进行了C#的代码转换,怎么看都以为仍是C#简单啊,根本不用说啥,代码一贴就秒懂了。。。
%%script csharp
try
{
Convert.ToInt32("mmd");
}
catch (Exception ex)
{
// Input string was not in a correct format
Console.WriteLine(ex.Message);
}
%%script csharp
//抛出自定义异常
try
{
throw new Exception("出错了啊");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
你能够自定义异常类,继承Exception便可,对了C#里面也是有finally的
try
{
throw new Exception("出错了啊");
//Convert.ToInt32("mmd");
}
catch (Exception ex)
{
// Input string was not in a correct format
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("finally");
}
如今一些须要finally的地方基本上都被using(){}接管了,因此特定场景会使用
先这样了