Python编程中不可避免的会出现错误,在调试阶段出现语法之类的错误时,Pycharm会在Debug窗口提示错误,但是程序在运行时由于内部隐含的问题而引起错误,会导致程序终止执行。比如以下例程中,使用urllib库打开URL时由于网络问题而发生了错误:

import urllib.request
req = urllib.request.urlopen('http://www.baidu.com')
print(req.read())
Traceback (most recent call last):
……
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

在Python中出现解释器无法正常处理的程序时会引发异常。如果要避免程序在异常发生时结束运行,那么通常使用异常处理语句捕捉异常,再通过其他的逻辑代码让程序继续运行。异常处理语句为try/except,它的基本语法结构如下:

try:
< 语句 > # 运行代码
except [(Error1, Error2, ...)[as e]]:
< 语句 > # 如果在try中引发了'Error1'异常
except [(Error3, Error4, ...)[as e]]:
< 语句 > # 如果在try中引发了'Error3'异常
except:
< 语句 > # 如果在try中引发了其他异常

当Python 解释器在执行 try 中的代码时出现异常,Python 解释器会依次判断该异常对象是否是 except 块后的异常类或其子类的实例,根据该异常的类型寻找能处理该异常对象的 except 块,如果找到合适的 except 块,则把该异常对象交给该 except 块处理。如果 Python 解释器找不到捕获异常的 except 块,则程序运行终止,Python 解释器也将退出。

从 try except 的基本语法格式可以看出,try 块仅有一个,但 except 代码块可以有多个,这是为了针对不同的异常类型提供不同的异常处理方式,比如以下例程中,分别定义了浮点计算错误FloatingPointError异常和输入/输出操作失败IOError异常:

try:
import urllib.request
req = urllib.request.urlopen('http://www.baidu.com')
print(req.read())
except FloatingPointError:
print("Capture FloatingPointError")
except IOError:
print("Capture IOError")
except Exception:
print("Capture Error")
except:
print("Capture Error")

以上程序针对 FloatingPointError、IOError类型的异常,提供了专门的异常处理逻辑。该程序运行时的异常处理逻辑可能有如下几种情形:

  • 如果在运行该程序时出现浮点计算错误,Python 将调用 FloatingPointError 对应的 except 块处理该异常。电动叉车
  • 如果在运行该程序时出现输入/输出操作失败,Python 将调用IOError对应的 except 块处理该异常。此处解释器会执行IOError的异常处理。
  • 如果在程序运行时出现其他异常,Python 可以调用 Exception 对应的 except 块处理该异常。当然except后面也可以不指定任何异常类。

在语法中的[]内为可选内容,于是可以有以下几种形式:

  • except 后不指定具体的异常名称,表示要捕获所有类型的异常。
try:
< 语句 > # 运行代码
except:
< 语句 > # 如果在try中引发了其他异常
  • except 后指定具体的异常名称,表示捕获指定类型的异常。比如 Error1、Error2、Error3、Error4分别表示各自的 except 块可以处理异常的具体类型。
try:
<语句> # 运行代码
except Error1:
<语句> # 如果在try中引发了'Error1'异常
  • [as e] 表示将异常类型赋值给变量 e,以方于在 except 块中调用异常类型。所有的异常对象都包含了如下几个常用属性和方法:
    • args:该属性返回异常的错误编号和描述字符串。
    • errno:该属性返回异常的错误编号。
    • strerror:该属性返回异常的描述字符串。
    • with_traceback():通过该方法可处理异常的传播轨迹信息。
try:
import urllib.request
req = urllib.request.urlopen('http://www.baidu.com')
print(req.read())
except FloatingPointError:
print("Capture FloatingPointError")
except IOError as e:
print("Capture IOError")
print(e.args) # 访问异常的错误编号和详细信息
print(e.errno) # 访问异常的错误编号
print(e.strerror) # 访问异常的详细信息
except:
print("Capture Error")
(TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None),)
None
None

如果要查看更详细的异常信息,可以导入traceback模块,使用print_exc()打印异常信息。print_exc()还可以接受file参数直接写入到一个文件。比如:

traceback.print_exc(file=open('except.txt', 'w+')) # 写入到except.txt文件去

以下为Python部分标准异常类:

·····························

Python基础系列讲解——try_except异常处理机制的更多相关文章

  1. Python基础系列讲解—动态类型语言的特点

    前言 在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变.在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分 ...

  2. Python基础系列讲解-自动控制windows桌面

    原链接:https://zhuanlan.zhihu.com/p/73001806 在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程 ...

  3. Python基础系列讲解——random模块随机数的生成

    随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...

  4. Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系. 所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的 ...

  5. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  6. Python基础系列讲解——时间模块详解大全之time模块

    Python中提供处理时间日期相关的内置模块有time.datetime和calendar. time模块中大多数函数调用了所在平台C library 的同名函数,因此更依赖于操作系统层面,所以tim ...

  7. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  8. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

  9. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

随机推荐

  1. 软件工程实践2019第五次作业——结对编程的编程实现 version1.1

    1.链接 我的博客链接https://github.com/S031402112 结对同学的博客https://www.cnblogs.com/jiabingge/ 我们队创建的仓库的Github项目 ...

  2. sql中的表值函数与标量值函数区别与用法

    通俗来讲: 听名字就知道区别了 表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂:标量值函数返回的只是一个值 一 .表值函数又分为内联函数与多语句函数 (1 ...

  3. Python的开源人脸识别库:离线识别率高达99.38%(附源码)

    Python的开源人脸识别库:离线识别率高达99.38%(附源码) 转https://cloud.tencent.com/developer/article/1359073   11.11 智慧上云 ...

  4. Vue CLI3和Vue CLI2环境搭建

    关于 Vue CLI 旧版本的安装以及创建项目 1.搭建 vue 的开发环境 ,安装 vue 的脚手架工具 官方命令行工具 npm install --global vue-cli / cnpm in ...

  5. Python3基础 函数 参数 在设定缺省值的情况下指明参数类型

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  6. web项目访问被拦截

    如图,一启动就出现下图登录界面 原因很简单就是被拦截了.pom.xml中引入了下面的包,注释掉就可以了.当然如果用了shiro等权限框架也可能出现类似问题.谁copy进来的,盘他. <!-- h ...

  7. 【Dart学习】--Dart之数字(num)相关方法总结

    一,部分属性 用法一(figureA) int figureA = -93; 是否为负数 print(figureA.isNegative); figureA是否是有限的 print(figureA. ...

  8. 【Redis】Redis Sentinel 哨兵模式搭建

    Redis Sentinel介绍 Redis Sentinel是Redis的官方高可用性解决方案 Redis Sentinel为Redis提供高可用性.实际上,这意味着使用Sentinel可以创建一个 ...

  9. [译]如何在GitHub仓库创建一个标签tag, 并推送到远程分支?

    问: 我在GitHub上有一个仓库,我需要给他打个tag.我在shell打了tag,但是在Github上没有显示出来.我还要做其他什么么? 我在shell中使用的命令是: git tag 2.0 当我 ...

  10. phpexcel 导出excel无法打开,提示文件格式或文件名无效,文件损毁,解决办法

    使用过很多次phpexcel了,有时需要保存文件到磁盘,有时需要浏览器弹出下载.保存到磁盘一半不会出现问题,关键是浏览器弹出保存,经常会发生导出的excel文件无法打开,提示文件格式或文件名无效,文件 ...