Python从入门到网络爬虫(异常处理详解)

前言

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在python无法正常处理程序时就会发生一个异常。异常是python对象,表示一个错误。当python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。总的来说,编写程序时遇到的错误可大致分为 2 类,分别为语法错误运行时错误。在 Python 中,把这种运行时产生错误的情况叫做异常(Exceptions),常见的几种异常情况如下:

1. 语法错误

语法错误,即解析代码时出现的错误。当代码不符合 Python 语法规则时,Python解释器在解析时就会报出 SyntaxError 语法错误,与此同时还会明确指出最早探测到错误的语句。

2. 运行时错误

运行时错误,即程序在语法上都是正确的,但在运行时发生了错误。

示例:a = 1/0

上面这句代码的意思是“用 1 除以 0,并赋值给 a 。因为 0 作除数是没有意义的,所以运行后会产生运行时错误。

在 Python 中,把这种运行时产生错误的情况叫做异常(Exceptions),常见的几种异常情况如下。

一、Python异常处理

当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try...except...结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。 基本语法结构如下所示:

try:

...

except

...

1.不确定异常类型时

不确定异常类型时,可用万能异常捕获:Exception

try:
    ipt = int(input("请输入数字:"))
except Exception:
    print(Exception) 
2.指定异常类型

当确定异常类型时,可以指定异常类型,例如:FileNotFoundError

try:    
    f = open("a.txt")    
    f.read()
except FileNotFoundError as e:    
    print(e)
3.捕获多个异常

当可能存在多个异常时,既可以定义多个except来捕获多个异常,也可以在一个except中声明多个异常

# try...except...except...定义多个except捕获多个异常
try:    
    a = [1, 2]    
    print(a[3])
except IOError as e:  # 由于try中的内容不属于IOError,所以会跳过这个异常,进入下一个异常进行判断    
    print("读写异常:",e)    
except IndexError as e:    
    print("列表越界异常:",e)  # 数组越界异常:list index out of range# try...except(IOError,ValueError)...一个except中声明多个异常

或者

try:    
    a = [1, 2]    
    print(a.index(3))
except (IOError, ValueError) as e:    
    print("读写异常或结果异常:",e)  # 读写异常或结果异常:3 is not in list

 二、try except else详解

在原本的try except结构的基础上,Python 异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else结构。 使用 else 包裹的代码,只有当 try 块没有捕获到任何异常时,才会得到执行;反之,如果 try 块捕获到异常,即调用对应的 except 来处理异常,else 块中的代码也不会得到执行。

try:    
    age = 18    
    print(age)
except ValueError as e:    
    print(e)
else:  # 只有当try中定义的语句无异常时,才会走到else分支    
    print("无异常")  # 打印结果:无异常

三、try except finally:资源回收

Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。在整个异常处理机制中,finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其 中的代码块。

# try...except...finally...异常捕获
try:    
    f = open('read1.txt')
except FileNotFoundError as e:    print(e)  # [Errno 2] No such file or directory: 'read1.txt'
else:    
    print("文件读写正常")
finally:  # 无论程序是否有异常,都会走到finally分支    
    print("over")  # over

 四、raise主动触发异常

当程序出现错误,Python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。 raise 语句的基本语法格式为:

raise [exceptionName [(reason)]]

raise 语句有三种常用的用法:

  • raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在except块中),或默认引发RuntimeError 异常。
  • raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
  • raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
try:    
    num = input("请输入一个数字:")    
    if not num.isdigit():        
        raise ValueError('num 非数字,请输入数字')
except ValueError as e:    print("结果异常,请检查输入项")

五、traceback模块:获取异常信息

在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。捕获异常时,有 2 种方式可获得更多的异常信息,分别是:

◆ 使用 sys 模块中的 exc_info 方法;

◆ 使用 traceback 模块中的相关函数。

1.借助sys模块中的exc_info方法
try:    
    f = open('read1.txt')    
    f.read()
except Exception as e:    
    print(e)  # [Errno 2] No such file or directory: 'read1.txt'    
    print(sys.exc_info())  # 打印异常信息    # (<class 'FileNotFoundError'>, FileNotFoundError(2, 'No such file or directory'), <traceback object at 0x033F5048>)

2.使用traceback模块中的相关函数

使用 traceback 模块查看异常传播轨迹,首先需要将 traceback 模块引入,该模块提供了如下两个常用方法:

◆ traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件中。

◆ format_exc():返回一个字符串而不是打印到文件。

traceback.print_exc()


try:    
    f = [0, 1, 2, 3]    
    f.index(5)
except ValueError as e:    
    print(traceback.print_exc())  	# 将异常信息输出到控制台或指定文件中,注:此时控制台打印的为捕获的异常信息,非报错

 format_exc()

try:    
    f = [0, 1, 2, 3]    
    f.index(5)
except ValueError as e:    
    # 将异常信息输出到控制台或指定文件中,注:此时控制台打印的为捕获的异常信息,非报错    
    error_info = traceback.format_exc()  # 返回一个字符串而不是打印到文件    
    print(error_info)

总结

Python常见的异常类型分为语法错误和运行时错误,对于运行时错误,我们可以采用try except进行异常捕获,从而进行处理。不确定异常类型时,可用万能异常捕获:Exception,能够确定异常类型时,可以指定异常类型,例如:FileNotFoundError、IndexError......当可能存在多个异常时,既可以定义多个except来捕获多个异常,也可以在一个except中声明多个异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/300058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。

家里有必要买NAS吗?

完全没有必要&#xff0c;因为用旧电脑搭建NAS不仅价格实惠&#xff0c;而且非常简单&#xff0c;效果也完全不差买了的&#xff01; 并且......还环保 教程链接&#xff1a; 用旧电脑搭建NAS在您的家庭中&#xff0c;通过将旧 PC 转变为NAS服务器&#xff0c;您可以轻松搭建…

【Docker】创建,查看,进入容器

目录 方式一&#xff1a; 创建 查看 ​编辑 方式二&#xff1a; 创建 查看 进入容器 方式一&#xff1a; 首先查看有什么镜像 创建 docker run -i -t --namefreedom centos:7 /bin - i 表示容器一直运行着&#xff0c;容器如果没有客户端连接就会关闭&#xff0c;加了…

【无标题】MySQL8修改非root用户密码

首先查看修改的用户信息&#xff0c;我这里用户名是demo&#xff0c;host是**%** 然后使用alter命令修改密码 这里USER后的参数是第一步里查询得到的user与host的组合。ALTER USER demo% IDENTIFIED WITH mysql_native_password BY 新密码;可能会出现的错误&#xff1a; 如果百…

听GPT 讲Rust源代码--compiler(32)

File: rust/compiler/rustc_middle/src/middle/exported_symbols.rs 在Rust的源代码中&#xff0c;rust/compiler/rustc_middle/src/middle/exported_symbols.rs文件的作用是实现编译器中处理导出符号的功能。 该文件中定义了一些结构体和枚举&#xff0c;用于描述导出符号的信…

李沐-《动手学深度学习》-- 01-预备知识

一、线性代数知识 1. 矩阵计算 a. 矩阵求导 ​ 当y和x分别为标量和向量时候&#xff0c;进行求导得到的矩阵形状&#xff0c;矩阵求导就是矩阵A中的每一个元素对矩阵B中的每一个元素求导 ​ 梯度指向的是值变化最大的方向 ​ 分子布局和分母布局&#xff1a; b. 常识 ax…

设计模式③ :生成实例

文章目录 一、前言二、Singleton 模式1. 介绍2. 应用3. 总结 三、Prototype 模式1. 介绍2. 应用3. 总结 四、Builder 模式1. 介绍2. 应用3. 总结 五、Abstract Factory 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所…

Linux_CentOS_7.9_Oracle11gr2配置数据库及监听服务自启动多方案实操之简易记录

前言: 作为运维保障,都无法准确预估硬件宕机的突发阶段,其生产数据实时在产出,那作为dba数据库服务以及相关Listener的其重要性、必要性就突显而出。这里拿虚拟机试验做个配置记录,便于大家学习参考。 实现方法一: 环境变量值::$ORACLE_HOME= /data/oracle/product/1…

ASP.NET Core基础之图片文件(二)-WebApi图片文件上传到文件夹

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…

基于机器视觉的车牌检测-边缘检测因子的选择

车牌检测概述 车牌识别在检测报警、汽车出入登记、交通违法违章以及移动电子警察方面应用广泛。车牌识别过程为&#xff1a;首先通过摄像头获取包含车牌的彩色图像&#xff1b;然后进行车牌边缘检测&#xff0c;先粗略定位到车牌位置&#xff0c;再精细定位&#xff1b;最后根…

你真的会用 Postman 吗?

1. 场景 提到 Postman&#xff0c;大部分的人可能只停留在使用 Postman「 模拟网络请求 」这单一功能上面。 事实上&#xff0c;Postman 的功能很强大&#xff0c;下面将罗列出几个比较少用&#xff0c;但实用的功能。 2. 抓包及拦截器 除了 Fiddler 和 Charles&#xff0c…

深入浅出Nacos的原理

前言 本文来讲一讲nacos作为底层注册中心的实现原理。那么就有这几个问题&#xff1f; 临时实例和永久实例是什么&#xff1f;有什么区别&#xff1f; 服务实例是如何注册到服务端的&#xff1f; 服务实例和服务端之间是如何保活的&#xff1f; 服务订阅是如何实现的&#…

idea怎么设置作者信息(详细)

目录 一&#xff1a;在Java类的开头自动注释作者名字和日期等信息 二&#xff1a;给Java的方法注释作者名字和日期等信息 1. 不可修改的模板&#xff1a;Postfix Completion 2. 可修改的模板&#xff1a;Live Templates tips&#xff1a;首先给大家推荐两款好用的免费软件&…

C语言汇总(持续更新)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。非常感谢各位的支持&#xff0c;也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏&#xff0c;内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持&#xff0c;有任何问题欢迎私信与…

IM即时通讯如何引领数字化时代的沟通革命?

在当今数字化时代&#xff0c;高效的即时通讯成为了企业无法缺少的工具。作为一款出色的IM即时通讯工具&#xff0c;WorkPlus以其卓越性能和创新功能&#xff0c;成为了最好的选择。 WorkPlus之所以被赞誉为优秀的IM即时通讯工具&#xff0c;首先在于其出色的性能。WorkPlus提供…

【强力推荐】GitCode AI开源搜索,面向开发者的专业AI搜索

一、GitCode AI开源搜索是什么&#xff1f; GitCode AI开源搜索 是面开发者的 AI 开源搜索工具&#xff0c;目的是为了帮助开发者快速寻找开源项目代码、解决开发问题和快速寻找答案&#xff0c;帮助开发者提升效率的同时利用代码仓托管能力建立自己个人知识库。 二、GitCode…

代码整洁之道:一个提升代码可读性的小技巧

写在开头 如何写好代码&#xff0c;一千个人眼中有一千个哈姆雷特&#xff0c;但是我认为有一点的是写好代码的公理&#xff0c;不可撼动&#xff0c;即对代码可读性的追求。最近在工作中面对了太多可读性不佳的代码&#xff0c;使得对于旧有代码的维护和分析困难重重&#xf…

Priors in Deep Image Restoration and Enhancement: A Survey

深度图像恢复和增强中的先验&#xff1a;综述 论文链接&#xff1a;https://arxiv.org/abs/2206.02070 项目链接&#xff1a;https://github.com/VLIS2022/Awesome-Image-Prior (Preprint. Under review) Abstract 图像恢复和增强是通过消除诸如噪声、模糊和分辨率退化等退化…

c语言的一些题(2024_1_7)

变种水仙花数 #include <stdio.h>int main() {int a 10000;for (; a < 100000; a){if ((a / 10000) * (a % 10000) (a / 1000) * (a % 1000) (a / 100) * (a % 100) (a / 10) * (a % 10) a)printf("%d ", a);}return 0; } //变种水仙花数 - Lily Num…

详细全面的postman接口测试实战教程

基本介绍 postman是一款流程的接口调试工具&#xff0c;其特点就是使用简单&#xff0c;功能强大。使用角色也非常广泛&#xff0c;后端开发&#xff0c;前端人员&#xff0c;测试人员都可以使用它进行接口调试或测试。 基本框架 如果把postman去其内容只保留框架的话&#…