周末多码文,昨天晚上一篇,今天再来一篇:

在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master

在线预览:http://github.lesschina.com/python/base/oop/3.异常相关.html

代码裤子:https://github.com/lotapp/BaseCode/tree/master/python/2.OOP/4.Exception

1.异常

1.1 try...except

又到了开新课的时候了,小明同学这次提前预习了知识,乘着老师还没来就在黑板上写下了这段Code:

In [1]:
  1. def main():
  2. try:
  3. 1 / 0 # ZeroDivisionError: division by zero
  4. except ZeroDivisionError as ex:
  5. print(ex)
  6.  
  7. if __name__ == '__main__':
  8. main()
 
  1. division by zero
 

1.2 try...except...else...finally

小潘同学刚进来就看见了,自语道:“try...except捕获异常谁不会?就会这么屁点东西还好意思秀,切~ 我给你把 格式补全”

于是乘着小明上厕所的时候,擦掉小明的Code,自己写了一段高大上的Code:

In [2]:
  1. # 异常捕获全格式
  2. def test(input_str):
  3. try:
  4. eval(input_str)
  5. except ZeroDivisionError as ex:
  6. print("except:", ex)
  7. else:
  8. print("else:没有异常就奖励100块~")
  9. finally:
  10. print("finally:小明是傻子~")
  11.  
  12. def main():
  13. test("1/0")
  14. print("-" * 10)
  15. test("print('小明啊小明你调坑里了~')")
  16.  
  17. if __name__ == '__main__':
  18. main()
 
  1. except: division by zero
  2. finally:小明是傻子~
  3. ----------
  4. 小明啊小明你调坑里了~
  5. else:没有异常就奖励100块~
  6. finally:小明是傻子~
 

这时候小明和老师一起进来了,同学们隐约间都听到小明的自夸声:“老师,我可好了,提前预习并且还写了个demo在黑板上呢~”

老师一进门看着黑板就笑了,同学们也笑成一片。小明心想,咦~难道我写错了?定眼一看黑板,气呼呼的回座位了

else可以不写,不过我们 基本上还是会写的,毕竟可以知道是真的没有错误,而不是屏蔽了错误

1.3 多个异常处理

老师很欣慰,觉得这个班真有意思,大家学习空前热情,为了照顾小明,老师反问道:“有谁知道 多个异常怎么处理?”

小明飞快的举手并把黑板上内容擦完,写下了如下代码:

In [3]:
  1. # 多个异常捕获
  2. def main():
  3. try:
  4. print(xiaopan) # NameError: name 'xiaopan' is not defined
  5. 1 / 0 # ZeroDivisionError: division by zero
  6. except NameError as ex:
  7. print(ex)
  8. except ZeroDivisionError as ex:
  9. print(ex)
  10.  
  11. if __name__ == '__main__':
  12. main()
 
  1. name 'xiaopan' is not defined
 

老师问了小明一声,有几个输出?

小明骄傲的说道:“两个,我写了两个异常处理,当然都执行了”

同学们又笑了,小潘调侃的说了句:“一看就知道去年C#没好好学,这不都一样嘛,遇到异常下面代码还执行吗?用脑子好好想想”

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至except语句块,执行完except后,如果有finally语句块,则执行finally语句块

小明又尴尬了。。。

1.4 多异常简写

老师再次帮小明圆了个场:“已经很不简单了,就是最后小得意的时候口误了,那小明同学你知道Python里面多异常有个便捷写法吗?”

小明赶紧拿起粉笔刷刷刷的写完,然后说道:“of course

In [4]:
  1. # 多个异常捕获的简写(注意哦,是元组哦)
  2. def main():
  3. try:
  4. print(xiaopan) # NameError: name 'xiaopan' is not defined
  5. 1 / 0 # ZeroDivisionError: division by zero
  6. except (NameError, ZeroDivisionError) as ex:
  7. print(ex)
  8.  
  9. if __name__ == '__main__':
  10. main()
 
  1. name 'xiaopan' is not defined
 

老师赶紧夸了夸小明,心想,哎呦喂终于把这难缠的家伙弄回座位了。

小明走前还不忘说一句:“简写的时候注意格式哦,是 元组 不是逗号分隔”

老师这堂课很轻松,大家都预习了而且内容也比较简单。

接着以提问的方式问道:“小潘同学,你知道异常的基类是什么吗?如果要捕获所有异常该怎么做呢?”

小潘站起来说道:“是BaseException

老师扩充道:“所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也一起捕获了”

所以一般在捕获异常的时候 把子类异常放在前面,父类放在后面

看如下代码:

In [5]:
  1. def main():
  2. try:
  3. 1 / 0 # ZeroDivisionError: division by zero
  4. except BaseException as ex:
  5. print("base:", ex)
  6. except ZeroDivisionError as ex:
  7. print(ex)
  8.  
  9. if __name__ == '__main__':
  10. main()
 
  1. base: division by zero
 

如果把父类放第一个,那么ZeroDivisionError永远也不会被执行了,其实你如果装了 代码规范提示插件会提示你的

可以参考我之前写的 vscode设置python3调试环境的扩充部分

来个通用异常捕获的简写(官方不推荐使用简写):

In [6]:
  1. # 直接except就行了
  2. def main():
  3. try:
  4. 1 / 0
  5. dnt += 1
  6. except:
  7. print("屏蔽错误")
  8.  
  9. if __name__ == '__main__':
  10. main()
 
  1. 屏蔽错误
 

老师继续讲到,我们来看一个场景,现在很多在线编辑器,你在他们那些编辑框里写下了代码也是有异常抛出的,这是怎么处理的呢?

微软有开源代码编辑器比较受欢迎(VSCode的一部分):monaco-editor

提示一下,如果真的要做在线编辑器,记得考虑一下fork炸弹,这个其实也是很老的东西了,程序员基本上都应该接触过了

1.5 抛出异常

我们继续,像C#是用thorw抛出异常,那Python怎么 捕获异常后再抛出 呢?怎么自定义异常 呢?

继续往下看:

In [7]:
  1. # 捕获异常后再丢出,eg:在线运行的用户Code
  2. def main():
  3. try:
  4. 1 / 0 # ZeroDivisionError: division by zero
  5. except ZeroDivisionError as ex:
  6. print(ex) # 写个日志,回头出问题可以深究
  7. raise
  8.  
  9. if __name__ == '__main__':
  10. main()
 
  1. division by zero
 
  1. ---------------------------------------------------------------------------
  2. ZeroDivisionError Traceback (most recent call last)
  3. <ipython-input-7-15f01346e2d8> in <module>()
  4. 9
  5. 10 if __name__ == '__main__':
  6. ---> 11main()
  7.  
  8. <ipython-input-7-15f01346e2d8> in main()
  9. 2 def main():
  10. 3 try:
  11. ----> 41 / 0 # ZeroDivisionError: division by zero
  12. 5 except ZeroDivisionError as ex:
  13. 6 print(ex) # 写个日志,回头出问题可以深究
  14.  
  15. ZeroDivisionError: division by zero
In [8]:
  1. # 抛出自定义异常
  2. class DntException(BaseException):
  3. pass
  4.  
  5. def get_age(num):
  6. if num <= 0:
  7. raise DntException("num must>0")
  8. else:
  9. print(num)
  10.  
  11. def main():
  12. get_age(-1)
  13. get_age(22) # 程序崩了,这句话不会被执行了
  14.  
  15. if __name__ == '__main__':
  16. main()
 
  1. ---------------------------------------------------------------------------
  2. DntException Traceback (most recent call last)
  3. <ipython-input-8-7c9dec6ec225> in <module>()
  4. 17
  5. 18 if __name__ == '__main__':
  6. ---> 19main()
  7.  
  8. <ipython-input-8-7c9dec6ec225> in main()
  9. 12
  10. 13 def main():
  11. ---> 14get_age(-1)
  12. 15 get_age(22) # 程序崩了,这句话不会被执行了
  13. 16
  14.  
  15. <ipython-input-8-7c9dec6ec225> in get_age(num)
  16. 6 def get_age(num):
  17. 7 if num <= 0:
  18. ----> 8raise DntException("num must>0")
  19. 9 else:
  20. 10 print(num)
  21.  
  22. DntException: num must>0
 

异常这一块基本上讲完了(logging模块后面会说)有什么补充的可以说的^_^

 

1.6 C#异常

小明又进行了C#的代码转换,怎么看都觉得还是C#简单啊,根本不用说啥,代码一贴就秒懂了。。。

In [1]:
  1. %%script csharp
  2. try
  3. {
  4. Convert.ToInt32("mmd");
  5. }
  6. catch (Exception ex)
  7. {
  8. // Input string was not in a correct format
  9. Console.WriteLine(ex.Message);
  10. }
 
  1. Input string was not in a correct format.
In [2]:
  1. %%script csharp
  2. //抛出自定义异常
  3. try
  4. {
  5. throw new Exception("出错了啊");
  6. }
  7. catch (Exception ex)
  8. {
  9. Console.WriteLine(ex.Message);
  10. }
 
  1. 出错了啊
 

你可以自定义异常类,继承Exception即可,对了C#里面也是有finally的

  1. try
  2. {
  3. throw new Exception("出错了啊");
  4. //Convert.ToInt32("mmd");
  5. }
  6. catch (Exception ex)
  7. {
  8. // Input string was not in a correct format
  9. Console.WriteLine(ex.Message);
  10. }
  11. finally
  12. {
  13. Console.WriteLine("finally");
  14. }

现在一些需要finally的地方基本上都被using(){}接管了,所以特定场景会使用

先这样了

Python3 与 C# 面向对象之~异常相关的更多相关文章

  1. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  2. Java面向对象之异常详解

    目录 Java面向对象之异常[一] Java面向对象之异常[二] 捕获异常的规则 访问异常信息 异常对方法重写的影响 finally详解 Java面向对象之异常[一] Java面向对象之异常[二] 往 ...

  3. Java面向对象之异常【一】

    目录 Java面向对象之异常[一] 异常的继承体系 Error Exception 异常是否受检 unchecked exceptions(不受检异常) checked exceptions(受检异常 ...

  4. Python3 tesseract加载chi_sim异常停止工作

    Python3 tesseract加载chi_sim异常停止工作 原因: chi_sim.traineddata 和 tesseract3.0.2 版本不一致: 解决方案: 下载tesseract3. ...

  5. WinDbg常用命令系列---异常相关操作

    .exr (Display Exception Record) .exr命令显示异常记录的内容. .exr Address .exr -1 参数: Address指定异常记录的地址.如果指定-1作为地 ...

  6. 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识

    Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍. 一.    类和对象(实例) 在面向对象的程序设计(OOP)过程中有两个重要概念 ...

  7. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  8. 黑马程序员_Java面向对象_异常

    6.异常 1.异常: 就是程序在运行时出现不正常的情况.问题也是现实生活中一个具体的事物,也可以通过Java的类进行描述,并封装成对象.Exception和Error的子类名都是以父类名作为后缀名. ...

  9. Python3 系列之 面向对象篇

    面向对象的三大特性:继承.封装和多态 Python 做到胶水语言,当然也支持面向对象的编程模式. 封装 class UserInfo(object): lv = 5 def __init__(self ...

随机推荐

  1. 一次linux问题分析原因的简要记录

    1. 这边功能测试 一个linux服务器 4c 16g的内存 发现总是出现异常. dotnet run 起来的一个 程序 总是会被killed 现象为: 2. 一开始怀疑是 打开的文件描述符过多 引起 ...

  2. day 7-16 单表查询

    一.准备工作 先把表建立好,方便一会查询. create table emp( id int not null unique auto_increment, name varchar(20) not ...

  3. 动态SQL3

    Oracle的批量操作 Oracle不支持VALUES(),(),()这种方式,所以不能用上一节所讲的方法. 有时候业务会包含很多次数据库操作,为了减少数据库连接,我们会选择一次提交大量sql, 这时 ...

  4. 动态SQL1

    If标签 动态SQL可以说是MyBatis最强大之处了,这块的应用主要有四个方面if,choose,trim和foreach,接下来先说说if. 顾名思义,if是用来判断条件的,现在假设我们有个需求, ...

  5. windows php7 安装redis扩展

    1,首先查看phpinfo 这会决定扩展文件版本(特别注意以php版本的architecture是x86还是64为准,不能以操作系统为准): 2.根据PHP版本号,编译器版本号和CPU架构  一定要根 ...

  6. shell中数组及其相关操作

    转载 https://blog.csdn.net/jerry_1126/article/details/52027539

  7. 莫烦keras学习自修第一天【keras的安装】

    1. 安装步骤 (1)确保已经安装了python2或者python3 (2)安装numpy,python2使用pip2 install numpy, python3则使用pip3 install nu ...

  8. Promise是什么?

    一. Promise是什么? Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来. 避免了多级异步操作的回调函数嵌套. Promise最早 ...

  9. 梯度下降取负梯度的简单证明,挺有意思的mark一下

    本文转载自:http://blog.csdn.net/itplus/article/details/9337515

  10. NC部门考勤月报定制sql

    SELECT t_1.pk_psndoc pk_psndoc, t_1.pk_group pk_group, t_1.pyear pyear, t_1.month month, t_1.code ps ...