Python异常原理及异常捕捉实现过程解析

关于选课程序,最近着实有点忙,没机会复习os、pickle两部分模块,所以数据储存和字典读取成为了一个问题,大致原理知道,但是具体操作可能还是得返回去再好好看看,所以目前就提前开始学习新的知识了,虽然今天感觉str的相关方法忘的是干干净净的,但是我有pycharm。

今天主要内容是关于异常,其实有点想最开始刚学的感觉,比较简单。

  异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下:

  错误被分为了两种:

  1.语法错误,基本pycharm都会帮你显示出来,不该犯的

  2.逻辑错误,不太容易看出来,pycharm也不管,只有Python解释器是真爱,但是也得等到真的运行的时候

#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'

  下面是今天最为重要的部分:

  在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误

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

  更多异常(有空还是要挨个错一遍):

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

  为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,

   如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

  之前也是有操作过的:

AGE=10
while True:
  age=input('>>: ').strip()
  if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
    age=int(age)
    if age == AGE:
      print('you got it')
      break

如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

#基本语法为
try:
  被检测的代码块
except 异常类型:
  try中一旦检测到异常,就执行这个位置的逻辑
#举例
try:
  f=open('a.txt')
  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()
#1 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
s1 = 'hello'
try:
  int(s1)
except IndexError as e: # 未捕获到异常,程序直接报错
  print e

#2 多分支
s1 = 'hello'
try:
  int(s1)
except IndexError as e:
  print(e)
except KeyError as e:
  print(e)
except ValueError as e:
  print(e)

#3 万能异常Exception
s1 = 'hello'
try:
  int(s1)
except Exception as e:
  print(e)

#4 多分支异常与万能异常
#4.1 如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么骚年,大胆的去做吧,只有一个Exception就足够了。
#4.2 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。

#5 也可以在多分支后来一个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)

#6 异常的其他机构
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('无论异常与否,都会执行该模块,通常是进行清理工作')

#7 主动触发异常
try:
  raise TypeError('类型错误')
except Exception as e:
  print(e)

#8 自定义异常
class EgonException(BaseException):
  def __init__(self,msg):
    self.msg=msg
  def __str__(self):
    return self.msg

try:
  raise EgonException('类型错误')
except EgonException as e:
  print(e)

#9 断言:assert 条件
assert 1 == 1
assert 1 == 2

#10 总结try..except

异常捕捉的优势:

1:把错误处理和真正的工作分开来

2:代码更易组织,更清晰,复杂的工作任务更容易实现;

3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

主要是理论知识,后期使用才是关键,就像我要复习的pickle和os模块一样,就是这些了。

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

(0)

相关推荐

  • python实现异常信息堆栈输出到日志文件

    将try except中捕获到的异常信息输出到日志文件中,方便查找错误原因,tranceback模块提供了把详细出错堆栈信息格式化成字符串返回函数format_exc(). 具体代码如下 import traceback import logging logging.basicConfig(filename='log.log') def error_func(): b = 1 / 0 if __name__ == '__main__': try: error_func() except: s =

  • Python运行异常管理解决方案

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

  • python3 使用traceback定位异常实例

    1.我们使用正常的输出语句 得到的是(输出结果:division by zero)虽然得到了错误的日志输出,但是不知道为什么出错,也不能定位具体出错位置. 2.现在我们使用 traceback 就可以得到具体的错误,以及定位到出错的位置.这样就能更方便调试错误. 参考文献 traceback文档地址: https://docs.python.org/2/library/traceback.html 以下为google翻译(仅供参考,): 该模块提供了一个标准接口,用于提取,格式化和打印Pytho

  • python实现数据清洗(缺失值与异常值处理)

    1. 将本地sql文件写入mysql数据库 本文写入的是python数据库的taob表 source [本地文件] 其中总数据为9616行,列分别为title,link,price,comment 2.使用python链接并读取数据 查看数据概括 #-*- coding:utf-8 -*- #author:M10 import numpy as np import pandas as pd import matplotlib.pylab as plt import mysql.connector

  • python打印异常信息的两种实现方式

    1. 直接打印错误 try: # your code except KeyboardInterrupt: print("quit") except Exception as ex: print("出现如下异常%s"%ex) 如下例子 try: 2/0 except Exception as e: print(e) 结果为:division by zero 2. 用traceback模块打印 上述结果看不到具体错误的信息,如行数啥的,不方便调试的时候定位,因此也可以用

  • python自动化测试之异常及日志操作实例分析

    本文实例讲述了python自动化测试之异常及日志操作.分享给大家供大家参考,具体如下: 为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法. 一.日志 打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态.Python标准库提供了logging模块,切记Logger从来不直接实例化,其好处不言而喻,接下来慢慢讲解Logging模块提供了两种记录日志的方式.

  • python异常处理、自定义异常、断言原理与用法分析

    本文实例讲述了python异常处理.自定义异常.断言原理与用法.分享给大家供大家参考,具体如下: 什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象,如果传入一个不能转化的对象就会报错并抛出异常 常用的异常有: ValueError :传入无效的错误的参数 TypeError:进行了对类型无效的操作 IndexError:序列中没有此索引 NameError:使用未定义的变量 更多更具体的异常可以参考Python官方文档,读读官方文档更健康 异常

  • Python生成个性签名图片获取GUI过程解析

    这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序的原理是 从一个url = ' http://www.uustv.com/ '中爬取个性签名的图片. 在该网页中审查该图片的元素,然后找到该图片的imgur 使用正则表达式直接定位 程序的后面使用到了tkinter的 GUI简易界面,用于和用户的简单交互,非常方便. 整个程序的完整代码如下: (有任

  • Python FTP文件定时自动下载实现过程解析

    这篇文章主要介绍了Python FTP文件定时自动下载实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.需求: 某数据公司每日15:00~17:00之间,在其FTP发布当日数据供下载,我方需及时下载当日数据至指定本地目录. 二.分析: 1.需实现FTP登陆.查询.下载功能: 解答:使用内置的ftplib模块中FTP类: 2.需判断文件是否下载: 解答:使用os模块中path.exists方法: 3.需判断在指定时间段内才执行下载任

  • python实现迭代法求方程组的根过程解析

    这篇文章主要介绍了python实现迭代法求方程组的根过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有方程组如下: 迭代法求解x,python代码如下: import numpy as np import matplotlib.pyplot as plt A = np.array([[8, -3, 2], [4, 11, -1], [6, 3, 12]]) b = np.array([[20, 33, 36]]) # 方法一:消元法求解

  • Python enumerate函数遍历数据对象组合过程解析

    这篇文章主要介绍了Python enumerate函数遍历数据对象组合过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. Python 2.3. 以上版本可用,2.6 添加 start 参数. enumerate(sequence, [start=0]) # sequence 是一个序

  • Python pygame绘制文字制作滚动文字过程解析

    这篇文章主要介绍了Python pygame绘制文字制作滚动文字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字体常用的不是很多,在pygame中大多用于提示文字,或者记录分数等事件. 字体绘制基本分为以下几个步骤: 初始化字体模块 pygame.init() 创建一个字体对象 可以从文件或者系统内字体选取 pygame.font.SysFont('幼圆',50) 绘制文本对象. a.render("测试字体",True,(

  • Python异常原理及异常捕捉实现过程解析

    关于选课程序,最近着实有点忙,没机会复习os.pickle两部分模块,所以数据储存和字典读取成为了一个问题,大致原理知道,但是具体操作可能还是得返回去再好好看看,所以目前就提前开始学习新的知识了,虽然今天感觉str的相关方法忘的是干干净净的,但是我有pycharm. 今天主要内容是关于异常,其实有点想最开始刚学的感觉,比较简单. 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下:

  • Python QTimer实现多线程及QSS应用过程解析

    多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度. 程序的运行速度可能加快. 在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等. 每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程不能够独立执行,必须依存在应用程序中,由应用程序提

  • python 模拟贷款卡号生成规则过程解析

    前言 笔者在测试某web系统的过程中,需要用到"贷款卡号",且此贷款卡号仅能使用一次,保存过后下一次无法再次使用相同的卡号. 遂决定依据它的生成规则,自己写一段代码来实现. 同时为了方便起见,贷款卡的前三位默认用数字来实现. 1. 生成规则如下: 贷款卡编码一共有16位,最后两位是校验位 整个贷款卡编码的规则如下: 前三位:分别为数字或者大写英文字母 第四位到第十四位:分别为数字 后两位的校验码为 前十四位乘以权重相加后除以97后的余数再加1后得到的数字, 如果此数字为个位数,前面还需

  • Python实现串口通信(pyserial)过程解析

    pyserial模块封装了对串口的访问,兼容各种平台. 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser = serial.Serial('com1', 9600, timeout=1) 所有参数 ser = serial.Serial( port=None, # number of device, numbering starts at # zero. if everything fails, the user # can specif

  • Python selenium实现大麦网自动购票过程解析

    目录 实现免登陆 初始化加载 登录 cookies: 登录网站时出现的 假如说我现在本地有 cookies.pkl 那么 直接获取 打开浏览器 实现购票 选票操作 选择座位 下单操作 判断元素是否存在 购票完成, 退出 先来看看完成后的效果是怎么样的 开发环境 版 本:anaconda(python3.8.8) 编辑器:pycharm 代码实现步骤 实现免登陆 选座并且下单 实现免登陆 damai_url = 'https://www.damai.cn/' # 登录 login_url = 'h

随机推荐