python的中异常处理机制


Posted in Python onAugust 30, 2018

什么是异常处理

定义:异常处理就是我们在写Python时,经常看到的报错信息,例如;NameError TypeError ValueError等,这些都是异常。

异常是一个事件,改事件会在程序执行过程中发生,影响程序的正常执行,一般情况下,在python中无法处理程序时就会发生异常,异常时Python的一个对象,表示一个错误,当Python脚本发生异常时,我们需要捕获并处理异常,否则程序就会终止执行。

Python 使用被称为 异常 的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback ,其中包含有关异常的报告。异常是使用 try-except 代码块处理的。 try-except 代码块让 Python 执行指定的操作,同时告诉 Python 发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback 。

处理ZeroDivisionError异常

下面来看一种导致 Python 引发异常的简单错误。你可能知道不能将一个数字除以 0 ,但我们还是让 Python 这样做吧:

print(5/0)

报错:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    print(5/0)
ZeroDivisionError: integer division or modulo by zero

使用 try-except 代码块

当你认为可能发生了错误时,可编写一个 try-except 代码块来处理可能引发的异常。你让 Python 尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。

处理 ZeroDivisionError 异常的 try-except 代码块类似于下面这样:

try:
  print(5/0)
except ZeroDivisionError:
  print("You can't divide by zero!")

# You can't divide by zero!

如果 try-except 代码块后面还有其他代码,程序将接着运行,因为已经告诉了 Python 如何处理这种错误。

使用异常避免崩溃

发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。这种情况经常会出现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。

创建一个只执行除法运算的简单计算器:

print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
  first_number = input("\nFirst number: ")
  if first_number == 'q':
    break
  second_number = input("Second number: ")
  try:
    answer = int(first_number) / int(second_number)
  except ZeroDivisionError:
    print("You can't divide by 0!")
  else:
    print(answer)

try-except-else 代码块的工作原理大致如下:

Python 尝试执行 try 代码块中的代码;只有可能引发异常的代码才需要放在 try 语句中。有时候,有一些仅在 try 代码块成功执行时才需要运行的代码;这些代码应放在 else 代码块中。 except 代码块告诉 Python ,如果它尝试运行 try 代码块中的代码时引发了指定的异常,该怎么办。

通过预测可能发生错误的代码,可编写健壮的程序,它们即便面临无效数据或缺少资源,也能继续运行,从而能够抵御无意的用户错误和恶意的攻击。

处理 FileNotFoundError 异常

FileNotFoundError 错误是函数 open() 导致的,因此要处理这个错误,必须将 try 语句放在包含 open() 的代码行之前:

filename = 'alice.txt'
try:
  with open(filename) as f_obj:
    contents = f_obj.read()
except FileNotFoundError:
  msg = "Sorry, the file " + filename + " does not exist."
  print(msg)

处理多个文件

def count_words(filename):
  """ 计算一个文件大致包含多少个单词 """
  try:
    with open(filename) as f_obj:
      contents = f_obj.read()
  except FileNotFoundError:
    msg = "Sorry, the file " + filename + " does not exist."
    print(msg)
  else:
    # 计算文件大致包含多少个单词
    words = contents.split()
    num_words = len(words)
    print("The file " + filename + " has about " + str(num_words) + " words.")

filenames = ['a.txt', 'b.txt', 'c.txt', 'd.txt']
for filename in filenames:
  count_words(filename)

异常时保持静默

要让程序在失败时一声不吭,可像通常那样编写 try 代码块,但在 except 代码块中明确地告诉 Python 什么都不要做。 Python 有一个 pass 语句,可在代码块中使用它来让 Python 什么都不要做:

def count_words(filename):
  """ 计算一个文件大致包含多少个单词 """
  try:
    with open(filename) as f_obj:
      contents = f_obj.read()
  except FileNotFoundError:
    pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python文件操作类操作实例详解
Jul 11 Python
python字符串替换的2种方法
Nov 30 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
Python3 操作符重载方法示例
Nov 23 Python
python 平衡二叉树实现代码示例
Jul 07 Python
详解python 注释、变量、类型
Aug 10 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 Python
详解django中Template语言
Feb 22 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
python调用百度REST API实现语音识别
Aug 30 #Python
python调用百度语音REST API
Aug 30 #Python
python调用百度语音识别api
Aug 30 #Python
python实现ID3决策树算法
Aug 29 #Python
python实现C4.5决策树算法
Aug 29 #Python
python机器学习之KNN分类算法
Aug 29 #Python
深入理解python中sort()与sorted()的区别
Aug 29 #Python
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
基于jQuery倒计时插件实现团购秒杀效果
2016/05/13 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
python中split方法用法分析
2015/04/17 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
python版百度语音识别功能
2019/07/09 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
行政申诉状范文
2015/05/20 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
Nest.js参数校验和自定义返回数据格式详解
2021/03/29 Javascript
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA