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

目录
  • 前言
  • 异常与错误的概念
  • 错误分类
    • 语法错误
    • 运行时错误
    • 逻辑错误
  • 异常处理机制
    • 捕获异常并处理
    • 主动抛出异常
    • 断言处理
    • 自定义异常类
    • 常见异常及释义
  • 附:用户自定义异常实例
  • 总结

前言

继续更新Python基础语法,到目前为止Python基础语法已经接近了尾声,本次错误与异常处理更新完后会对文件、数据库、包管理、模块管理、正则表达式的使用进行更新。完成这几个大致的任务之后将会更新爬虫与数据分析。本专栏所写的东西非常的适用初学者,当然也非常适合老手,每一部分都有很全面的编程技巧。相信大家看完后会感觉受益匪浅。(文末附有常见异常表)

异常与错误的概念

错误顾名思义就是由于某种原因,产生了不符合我们预期的结果。我们的代码在运行时非常的有可能出现错误,我们有时又称这种现象为BUG,在Python中异常通常指的是我们的Python解释器发现了我们程序中存在的错误,自己无法解决该错误的时候向操作系统提出了报告引发程序中断。正如现实中我们个人犯错而监管我们的人发现我们的错误,发现我们的异常举动并进行处理。及时帮我们纠正错误行为。

错误分类

语法错误

语法错误又称为编译错误,是计算机操作系统在执行你的代码的时候,由于你代码存在语法性问题无法开始执行程序导致的错误,一般就是函数名、关键字用错导致或者进行导包的时候导入了不存在的包。随着编译器的迭代更新不断变强,这种错误已经非常少见了。Python中编译错误提示SyntaxErrorl例如下图(缺少一半括号):

运行时错误

运行时错误指的是程序通过了编译,计算机操作系统开始执行你的程序在代码执行过程中出由于编程者的疏忽,产生了代码之间的矛盾导致的错误。例如:没有考虑到数组边界或者变量范围导致数组越界、零除异常...这种错误会导致你的程序突然就挂掉一定情况下会造成灰常大的损失。例如以下情况:

逻辑错误

这种错误往往是人们最烦恼的错误,因为操作系统不会直接抛出异常给我们看,你的程序也可以正常运行,但是对程序输入值之后得到的结果就是不对。非常的气人,我们能改进这种错误的方式就是baidu、动脑思考、进行调试、实在不行找个老鸟帮你看看。常见的错误有:死循环、表达式错误、局部全局变量混用....

异常处理机制

捕获异常并处理

Python中采用了结构化的异常处理机制我们可以通过try对异常进行捕获,然后在except中进行异常的处理。最后在finally中进行资源释放之类的工作(有没有异常finally中的代码都会执行),与其他语言不同的是,在Python中引入了一个else机制,else中的语句只有在try中的代码没有异常的时候才会执行。有异常就不执行。详细操作见下面代码,正如所见,可以对多个类型的异常进行捕获。对多个异常进行捕获的话需要将类型涵盖范围较小的异常放在前面,而在捕获之前一般由try代码块中的代码或者函数进行异常的抛出

# 异常的捕获
a=int(input('输入除数:'))
b=int(input('输入被除数:'))
try:
    res=a/b
except ZeroDivisionError:
    print('除数不可以为0')
    # 相同处理方式的异常可以这么写
except (BaseException,TypeError):
    print('有错误')
else:
    print('您的结果为',res)
finally:
    print('感谢使用!')

主动抛出异常

我们可以轻松的进行异常的捕获并进行解决。但是有时候我们有一种需求就是将错误抛出给上一层进行处理。这时候主动抛出异常就登场了。在Python中主动抛出异常使用的是raise关键字。raise关键字一般与自定义异常类一块进行使用,所以大家先记住raise是主动抛出异常的关键字,待会到自定义异常类处看代码即可。

断言处理

断言处理使用语法为:assert <布尔表达式>或者assert <布尔值表达式> , <字符串表达式>。assert会先对布尔值表达式进行判断,如果表达式为True就不进行操作,否则会抛出异常。并在抛出的异常中输出字符串表达式的信息。具体操作可以看以下代码:

'''
3 录入一个学生的成绩,把该学生的成绩转换为A优秀、B良好、C合格、D不及格的形式,
最后将该学生的成绩打印出来。要求使用assert断言处理分数不合理(小于0或者大于100)的情况
请编写程序。
'''

n=int(input())
assert n in range(101),"您输入的成绩不合理!"
if n>=85:
	print("优秀!")
elif n>=70:
	print("良好!")
elif n>=60:
	print("合格!")
else:
	print("不及格!")

自定义异常类

Python官方库中提供了一系列的异常处理类,在Python中所有的异常均由类实现,所有的异常类又继承自BaseException类,程序运行时出现的异常大多继承自Exception类。Python支持自定义异常类。自定义异常类一般继承Exception或者其子类名称一般以Exception或者Error命名。

自定义异常类以及主动抛弃异常

'''
自己定义一个异常类,继承Exception类, 捕获下面的过程:判断input()输入的字符串长度是否小于5,
如果小于5,比如输入长度为3则输出:"The input is of length 3, expecting at least 5“,
大于5则输出"success”。
'''
class StrLenError(Exception):
	def __init__(self,s):
		Exception.__init__(self,s)
		self.s =s
	def __str__(self):
			return f"The input is of length {len(self.s)}, expecting at least 5"
n=input()
if len(n)<=5:
	raise StrLenError(n)
else:
	print("success")

常见异常及释义

以下是一些常见的类及引发该类异常的错误描述:

类名 描述
SyntaxError 发生语法错误时引发
FileNotFoundError 未找到指定文件或目录时引发
NameError 找不到指定名称的变量时引发
ZeroDivisionError 除数为0时的异常
IndexError 当使用超出列表范围的索引时引发
KeyError 当使用映射不存在的键时引发
AttributeError 当尝试访问未知对象属性时引发
TypeError 当试图在使用a类型的场合使用b类型时引发

附:用户自定义异常实例

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

>>> class NewError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)

>>> try:
        raise NewError(2*2)
    except NewError as e:
        print('New exception occurred, value:', e.value)

My exception occurred, value: 4
>>> raise NewError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.NewError: 'oops!'

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

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

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

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

总结

到此这篇关于Python基础教程之错误和异常处理的文章就介绍到这了,更多相关Python错误和异常处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 新手常见Python错误及异常解决处理方案

    写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和异常? 1.语法错误可能是初学者最常遇到的,如下面熟悉的画面: SyntaxError: invalid syntax语法错误又称解析错误,又有老哥会问什么是解析错误?简单来说是基本语法结构写错了,如:多任务写成一行.for循环没加':'等.如下: 多任务写成一行 for循环没加':' 上面示例可以

  • Python 错误和异常代码详解

    程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥马奔腾而过! 错误 程序错误,主要分为三类: 语法错误 逻辑错误 运行时错误 语法错误 语法错误(也称:解析错误):是指不遵循语言的语法结构引起的错误(程序无法正常编译/运行). 在编译语言(例如:C++)中,语法错误只在编译期出现,编译器要求所有的语法都正确,才能正常编译.不过对于直译语言(例如:

  • Python错误和异常总结详细

    目录 1.语法错误 2.异常 3.try...except...语句 4.多个except子句 5.try...except Exception as e语句 6.try...except...finally语句 7.with...语句 写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和异常? 1.语法错误 语法错误可能是初学者最常遇到的,如下面熟

  • Python运行错误异常代码含义对照表

    Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIteration 迭代器没有更多的值 GeneratorExit 生成器(generator)发生异常来通知退出 StandardError 所有的内建标准异常的基类 ArithmeticError 所有数值计算错误的基类 FloatingP

  • Python 错误和异常小结

    事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章.什么?你还不知道什么是异常,额... 1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用Python了). 异常 描述 NameError 尝试访问一个没有申明的变量 ZeroDivisionError 除数为0 Synt

  •  Python错误与异常处理

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

  • Python学习笔记之错误和异常及访问错误消息详解

    本文实例讲述了Python错误和异常及访问错误消息.分享给大家供大家参考,具体如下: 错误和异常 当 Python 无法解析代码时,就会发生语法错误,因为我们没有遵守正确的 Python 语法. 当在程序执行期间出现意外情况时,就会发生异常,即使代码在语法上正确无误.Python 有不同类型的内置异常. 指定异常 可以指定要在 except 块中处理哪个错误,如下所示: try: # some code except ValueError: # some code 现在它会捕获 ValueErr

  • 浅谈python中的错误与异常

    目录 一.语法错误 二.异常处理 2.1.try-finally语句 2.2.raise 语句 2.3.assert 断言语句 三.小结 一.语法错误 异常:大多数的异常都不会被程序处理,都以错误信息的形式展现在这里 二.异常处理 while True: try: x = int(input("请输入一个错误:")) break except ValueError: print("不是有效数字,再试一遍") try 语句执行顺序: 先执行try语句里面的语句,如果没

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

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

  • Python基础之语法错误和异常详解

    目录 一.前言 二.异常 三.异常处理 3.1 try/except 3.2 try/except ... else 3.3 try-finally 四.抛出异常 4.1 raise 五.用户自定义异常 六.断言 assert 一.前言 Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常. 二.异常 即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常 三.异常处理 3.1 try/except tr

  • Python基础教程之异常处理详解

    目录 前言 异常 错误与异常 语法错误 异常 异常处理 自主抛出异常 自定义异常 finally子句 总结 前言 最近发现有些东西长时间不用就要忘了,坚持每天复习总结一个小知识点吧~ 异常是什么呢?就是在代码执行过程中非预期的执行结果,随着代码越来越复杂,代码中的执行逻辑也会越来越复杂,如果没有处理好异常情况,很有可能造成软件执行错误,导致重大损失.相反,如果合理的处理异常情况,则可以增强软件的稳定性,提高体验感. 异常 在Python中,使用异常对象(exception object)来表示代

  • Python 基础教程之闭包的使用方法

    Python 基础教程之闭包的使用方法 前言: 闭包(closure)是函数式编程的重要的语法结构.函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式).在面向过程编程中,我们见到过函数(function):在面向对象编程中,我们见过对象(object).函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability).闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性. 不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭

  • Python基础教程之内置函数locals()和globals()用法分析

    本文实例讲述了Python基础教程之内置函数locals()和globals()用法.分享给大家供大家参考,具体如下: 1. 这两个函数主要提供,基于字典的访问局部变量和全局变量的方式. python 使用叫做名字空间的东西来记录变量的轨迹.名字空间是一个字典 ,它的键就是字符串形式的变量名字,它的值就是变量的实际值. 名字空间可以像 Python 的 dictionary 一样进行访问. 在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间. 每个函数都有着自已的名字空间,叫做

  • Python基础教程之循环语句(for、while和嵌套循环)

    循环可以用来重复执行某条语句,直到某个条件得到满足或遍历所有元素. 1 for循环 是for循环,可以把集合数据类型list.tuple.dict.set的元素遍历出来. (1)对list进行循环 city_list = ['广州','深圳','东莞','佛山'] city_list = ['广州','深圳','东莞','佛山'] for city in city_list: print("当前地市为:{0}".format(city)) 当前地市为:广州 当前地市为:深圳 当前地市为

  • Python基础教程之名称空间以及作用域

    目录 前言 名称空间 什么是名称空间 名称空间的意义 名称空间的查找顺序 局部名称空间详解 嵌套函数中的查找顺序 关于嵌套函数的使用 作用域 什么是作用域 global语句 nonlocal语句 题目题目 小结 总结 前言 所谓“基础不狠,人站不稳”,对于任何一种编程语言来说基础往往都是重中之重,以Python为例,其中的两大分水岭就是函数编程和面向对象,而今天所要巩固的知识点后续会多次使用,那就是名称空间和作用域 名称空间 什么是名称空间 在Python中名称空间是用存储对象和名字绑定关系的地

  • Python基础教程之浅拷贝和深拷贝实例详解

    Python基础教程之浅拷贝和深拷贝实例详解            网上关于Python的深拷贝和浅拷贝的文章很多,这里对三种拷贝进行比较并附实例,大家可以参考下 一般的复制 #encoding:utf-8 #定义一个嵌套集合 lista=[1,2,3,[4,5,6,[7,8,9]]] listb=lista #分别打印出 lista和listb的地址值 print id(lista) #4511103096 print id(listb) #4511103096 #修改lista中的内容,li

  • Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 建立一个文件夹filePackage 在filePackage 文件夹内创建 __init__.py 有了 __init__.py ,filePackage才算是一个包,否则只是算一个普通文件夹. 在filePackage 文件夹内创建 file.py file.py 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- from datetime import datetime class MyFile(

  • python基础教程项目五之虚拟茶话会

    几乎在学习.使用任何一种编程语言的时候,关于socket的练习从来都不会少,尤其是会写一些局域网的通信的东西.所以书上的这个项目刚好可以练习一下socket编程. 这个练习的整体思路首先有一个聊天的服务器,这个服务器的功能主要是提供客户端socket的连接.存储每个客户端的连接session,处理每个连接发送的消息.解析客户端发送的数据.就这些,至于客户端方面不需要写代码,用系统的telnet工具即可. 我觉得有了上面的分析,剩下的这个程序就没有什么说的了,当然,除了那两个把socket封装的类

随机推荐