Python中的异常处理讲解

目录
  • 一、什么是异常
  • 二、异常的种类
    • 1 、常用异常类
    • 2、异常举例:
  • 三、异常处理
    • 1、基本语法try...except
    • 2、多分支异常 except..except与万能异常:Exception
    • 3、try/except...else
    • 4、异常的最终执行finally
  • 四、抛出异常raise
  • 五、自定义异常
    • 基础异常类
  • 六、断言assert

一、什么是异常

在python中,错误触发的异常如下

二、异常的种类

在python中不同的异常可以用不同的类型去标识,一个异常标识一种错误。

1 、常用异常类

  • AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
  • IOError 输入/输出异常;基本上是无法打开文件
  • ImportError 无法引入模块或包;基本上是路径问题或名称错误
  • IndentationError 语法错误(的子类) ;代码没有正确对齐
  • IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
  • KeyError 试图访问字典里不存在的键
  • KeyboardInterrupt Ctrl+C被按下
  • NameError 使用一个还未被赋予对象的变量
  • SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
  • TypeError 传入对象类型与要求的不符合
  • UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
  • ValueError 传入一个调用者不期望的值,即使值的类型是正确的

2、异常举例:

# TypeError:int类型不可迭代
for i in 3:
    pass

# ValueError
num=input(">>: ") #输入hello
int(num)

# NameError
aaa

# IndexError
l=['egon','aa']
l[3]

# KeyError
dic={'name':'egon'}
dic['age']

# AttributeError
class Foo:pass
Foo.x

# ZeroDivisionError:无法完成计算
res1=1/0
res2=1+'str'

三、异常处理

1、基本语法try...except

try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑

举例

try:
    f = [ 'a', 'a', 'a','a','a', 'a','a',]
    g = (line.strip() for line in f) #元组推导式
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

s1 = 'hello'
try:
    int(s1)
except IndexError as e:  # 未捕获到异常,程序直接报错
    print(e)

2、多分支异常 except..except与万能异常:Exception

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)

3、try/except...else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

4、异常的最终执行finally

try-finally 语句无论是否发生异常都将执行最后的代码。

定义清理行为:

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
#except Exception as e:
#    print(e)
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')

#invalid literal for int() with base 10: 'hello'

#无论异常与否,都会执行该模块,通常是进行清理工作

四、抛出异常raise

Python 使用 raise 语句抛出一个指定的异常。

raise语法格式如下:

raise [Exception [, args [, traceback]]]
try:
    raise TypeError('抛出异常,类型错误')
except Exception as e:
    print(e)

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

try:
        raise NameError('HiThere')
    except NameError:
        print('An exception flew by!')
        raise

#An exception flew by!
#Traceback (most recent call last):
#  File "", line 2, in ?
#NameError: HiThere

五、自定义异常

你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

在这个例子中,类 Exception 默认的 __init__() 被覆盖。

class EgonException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

try:
    raise EgonException('抛出异常,类型错误')
except EgonException as e:
    print(e) 

#抛出异常,类型错误

基础异常类

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

大多数的异常的名字都以"Error"结尾,就跟标准的异常命名一样。

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

六、断言assert

assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。

语法格式如下:

assert expression

等价于:

if not expression:
    raise AssertionError

assert 后面也可以紧跟参数:

assert expression [, arguments]

等价于:

if not expression:
    raise AssertionError(arguments)

以下实例判断当前系统是否为 Linux,如果不满足条件则直接触发异常,不必执行接下来的代码:

import sys
assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
# 接下来要执行的代码

# Traceback (most recent call last):
#    File "C:/PycharmProjects/untitled/run.py", line 2, in
#      assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
#  AssertionError: 该代码只能在 Linux 下执行

到此这篇关于Python异常处理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python常见异常类型处理

    目录 1.Python语法错误 2.Python运行时错误 前言: 开发人员在编写程序时,难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误,还有的是程序运行时与系统的规则冲突造成的系统错误,等等. 总的来说,编写程序时遇到的错误可大致分为 2 类,分别为语法错误和运行时错误. 1.Python语法错误 语法错误,也就是解析代码时出现的错误.当代码不符合 Python 语法规则时,Python解释器在解析时就会报出 SyntaxError 语法错误,与此同

  • python基础之错误和异常处理

    import Exception # except 在捕获错误异常的时候 是要根据具体的错误类型来捕获的 # 用一个块 可以捕获多个不同类型的异常 # EXception 可以捕获所有异常 当对出现的问题或者错误不确定的情况下 可以使用此种 print(dir(Exception)) try: # print(b) #捕获逻辑的代码 li=[1,2,3,4] print(li[10]) pass except NameError as msg: # 捕获到的错误 才会在这里执行 print(ms

  • Python学习之异常处理的避坑指南

    目录 finally与return的执行顺序 else与return的执行顺序 总结 最终想了想,还是把这个章节单独拎出来,虽然字数不多. 在代码中,存在return也应当执行finally: 存在return时,else是不执行的: 无return时,else正常执行: 如果发生异常,则else也不执行 finally 与 return 的执行顺序 示例代码如下: class Test(object):     def division(self, num1, num2):         t

  • Python基础教程之错误和异常的处理方法

    目录 前言 异常与错误的概念 错误分类 语法错误 运行时错误 逻辑错误 异常处理机制 捕获异常并处理 主动抛出异常 断言处理 自定义异常类 常见异常及释义 附:用户自定义异常实例 总结 前言 继续更新Python基础语法,到目前为止Python基础语法已经接近了尾声,本次错误与异常处理更新完后会对文件.数据库.包管理.模块管理.正则表达式的使用进行更新.完成这几个大致的任务之后将会更新爬虫与数据分析.本专栏所写的东西非常的适用初学者,当然也非常适合老手,每一部分都有很全面的编程技巧.相信大家看完

  • Python学习之异常处理详解

    目录 什么是异常与异常处理 异常的语法 捕获通用异常 捕获具体异常 如何捕获多个异常 捕获多个异常-方法1 捕获多个异常-方法2 本章节主要学习 python 中的异常处理,来看一下该章节的内容有哪些.首先我们需要了解 什么是异常与异常的处理 ,然后再继续 异常的语法结构 什么是异常与异常处理 异常 —> 可以理解为不同寻常. 正常情况下,我们的程序是自上而下的逐行执行,执行到最后一行才会终止程序的执行.而异常的情况会导致我们的程序半途而废停止了执行.一般情况下的停止执行都是因为我们的程序出错而

  • Python中异常处理用法

    目录 1.if进行处理,在错误发生之前进行预防 2.用try..except:在错误发生之后进行处理 为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理, 1.if进行处理,在错误发生之前进行预防 如果错误发生的条件是可预知的,我们需要用if进行处理,在错误发生之前进行预防 AGE=10 while True: age=input('>>: ').strip() if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是

  •  Python错误与异常处理

    1. 从键盘输入一个整数,求 100 除以它的商,并显示输出.要求对从键盘输入的数值进行异常处理. try:     n=int(input("请输入一个整数:"))     x=100/n     print(x) except ValueError:     print("异常,请重新输入:") else:         #可选项,必须try-except语句为前提     print("程序正常运行,没有捕捉到异常") 2.编程实现索引超

  • python异常处理并调试

    目录 一.try-except 二.try-except-else 三.try-except-finally 四.处理多个异常 五.raise主动抛出异常 前言: 异常是错误出现时,可以在正常的控制流程之外采取的行为. 一.try-except try:     age = int(input("请输入年龄:"))     if age >= 18:         print("你已成年")     else:         print("你未成

  • 如何在Python中进行异常处理

    目录 一.抛出异常和自定义异常 1.raise语句 2.自定义异常类型 二.捕捉异常 1.捕捉多个异常 2.获取异常信息 三.finally子句 一.抛出异常和自定义异常 Python中使用用异常对象(exception object)表示异常情况,当程序运行遇到错误后,就会触发发异常.相信大家在编码是都会遇到这种情况,那么如果异常对象并未被处理或捕捉,程序就会用报错然后终止执行. 1.raise语句 Python中的raise 关键字用于触发发一个异常,和我们熟悉的Java中的throw关键字

  • Python中的异常处理讲解

    目录 一.什么是异常 二.异常的种类 1 .常用异常类 2.异常举例: 三.异常处理 1.基本语法try...except 2.多分支异常 except..except与万能异常:Exception 3.try/except...else 4.异常的最终执行finally 四.抛出异常raise 五.自定义异常 基础异常类 六.断言assert 一.什么是异常 在python中,错误触发的异常如下 二.异常的种类 在python中不同的异常可以用不同的类型去标识,一个异常标识一种错误. 1 .常

  • Python中的异常处理try/except/finally/raise用法分析

    本文实例分析了Python中的异常处理try/except/finally/raise用法.分享给大家供大家参考,具体如下: 异常发生在程序执行的过程中,如果python无法正常处理程序就会发生异常,导致整个程序终止执行,python中使用try/except语句可以捕获异常. try/except 异常的种类有很多,在不确定可能发生的异常类型时可以使用Exception捕获所有异常: try: pass except Exception, e: print Exception, ":"

  • python中entry用法讲解

    小编之前向大家讲解了很多关于字符串的知识,大家也都知道字符串在python中的作用很大,那你知道在python中用于接收字符串等输入,让用户可与之交互以输入或操作字符串数据的对象是什么吗?是 python tkinter中的Entry 控件,下面我们来一看看吧. 1.Entry:用于接受用户Entry小窗口部件单行文本字符串 2.使用 Entry 控件的语法 w = Entry(master, option, ...) 注意:master 参数为其父控件, 就是用来放置这个 Entry 的控件.

  • python中最小二乘法详细讲解

    python中在实现一元线性回归时会使用最小二乘法,那你知道最小二乘法是什么吗.其实最小二乘法为分类回归算法的基础,从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法.本文向大家介绍python中的最小二乘法. 一.最小二乘法是什么 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出). 二.最小二乘法实现原理 通过最小化误差的平方和寻找数据的最佳函数匹配. 三.最小二乘法功

  • Python中的异常处理相关语句基础学习笔记

    异常是指因为程序出现了错误而在正常控制流以外采取的行动,其分为两个阶段,第一阶段是引发异常的错误,当系统检测到错误并且意识到异常条件,解释器(也可以是程序员引发异常)会引发一个异常通知前段控制流有错误发生,对异常的处理发生在第二阶段,异常引发后,可以调用很多不同的操作,可以是忽略错误,或是记录错误但不采取任何措施,采取补救措施后终止程序,或是江青问题的影响后设法继续执行程序  类似Python这样支持引发和处理异常的语言,可以让开发人员在错误发生时不仅有检测错误的能力,还可以采取更可靠的补救措施

  • Python中logging实例讲解

    logging 的基本用法网上很多,这里就不介绍了.在引入正文之前,先来看一个需求: 假设需要将某功能封装成类库供他人使用,如何处理类库中的日志? 数年前在一个 C# 开发的项目中,我用了这样的方法:定义一个 logging 基类,所有需要用到日志的类都继承这个基类,这个基类中定义一个 LogHandler 事件,该事件用于实现具体的记录日志动作,同时可以通过将类 A 的 LogHandler 委托挂到类 B 的 LogHandler 上,实现将两个类的日志信息添加到一起. 自从看了 pytho

  • 解析Python中的异常处理

    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1. 用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,造成调用者必须用大量的代码来判断是否出错: def foo(): r = some_function() if r==(-1): return (-1) # do somethin

  • Python中的异常处理简明介绍

    python异常处理机制和java类似,采用try-except-finally的结构. try-except检测异常 格式 复制代码 代码如下: try:     try_statement except (ErrorType1, ErrorType2),e:     handle_statement finally:     finally_statement 实例 复制代码 代码如下: #!/usr/bin/python try:     a=12     b=0     c = a/b

  • Python中使用异常处理来判断运行的操作系统平台方法

    代码实例: 复制代码 代码如下: try:     import termios, TERMIOS 1 except ImportError:     try:         import msvcrt 2     except ImportError:         try:             from EasyDialogs import AskPassword 3         except ImportError:             getpass = "default

随机推荐