异常处理

错误和异常在编写程序的过程中程序出错是不可避免的;而这些错误可以分为俩种语法错误这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正逻辑错误异常异常是由于在执行程序的

大家好,又见面了,我是你们的朋友全栈君。

错误和异常

在编写程序的过程中  程序出错是不可避免的;而这些错误可以分为俩种

语法错误

这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正

#语法错误示范一
if    #if  后面缺少冒号

#语法错误示范二
def test: pass    #函数名后面没有括号

#语法错误示范三
print(haha         #打印的结果括号不完整

逻辑错误

#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
num=input(">>: ")
int(num)

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

异常<span role="heading" aria-level="2">异常处理

异常是由于在执行程序的的过程中因为代码的错误(语法错误或者逻辑错误)而引起的现象

<span role="heading" aria-level="2">异常处理

ps:程序一旦发生错误就从错误的位置停下来不再执行后面的内容

解决方案

.使用try   except可以检测到异常错误,并且将异常进行处理。但是执行一次只能解决一个类型的错误(value Error/type Error等只能解决一种类型的错误),一旦程序中再出现了另外一个类型的错误依然会报错,这样的情况就引出了万能异常来处理这种情况

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

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 

其他异常类型

既然程序再运行中出现了问题导致不能正常运行,那么就需要我们把这个麻烦解决掉对其进行一定的处理;首先我们先来看一下什么是异常处理吧!

异常处理

什么是异常处理:

python解释器检测到错误,触发异常(也允许程序员自己触发异常)

程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)

如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

知道了什么是异常处理,那么我们为什么要进行异常处理啊

为什么要进行异常处理

python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。

所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性 

接着来看一下怎么进行异常处理吧

如何进行异常处理

首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正

 方法一:使用if判断式

 1 num1=input('>>: ') #输入一个字符串试试
 2 if num1.isdigit():
 3     int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
 4 elif num1.isspace():
 5     print('输入的是空格,就执行我这里的逻辑')
 6 elif len(num1) == 0:
 7     print('输入的是空,就执行我这里的逻辑')
 8 else:
 9     print('其他情情况,执行我这里的逻辑')
10 
11 '''
12 问题一:
13 使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂
14 
15 问题二:
16 这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
17 '''
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。

2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差

3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。

方法二:python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

1.语法:

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

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

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

3.多分支

<span role="heading" aria-level="2">异常处理
<span role="heading" aria-level="2">异常处理

1 捕获异常
 2 num= input('num:>>')
 3 try:
 4     f= open ('file','w')
 5     # int(num)
 6     # l = []
 7     # l[10000]
 8     # 1 / 0
 9     # dic = {'k': 'v'}
10     # dic['k2']
11     print('-----------')
12 except ValueError :
13     print('请输入一个数字')
14 except NameError as name_e:
15     print(name_e)
16     print('=======')
17 except IndentationError as name_e:
18     print(name_e)
19 except IndexError as name_e:
20     print(name_e)
21 except SyntaxError as name_e:
22     print(name_e)
23 except ZeroDivisionError as name_e:
24     print(name_e)
25 except AttributeError as name_e:
26     print(name_e)
27 except KeyError as name_e:
28     print(name_e)
29 # except Exception as e:
30 #     print(e,'异常了')
31 else: #如果上面出现问题了,就不执行else,如果都正确了就会执行else里的内容(支付过程可以用到else)
32     print('else 被执行')
33 finally:  #不过这段代码出没出问题,都执行这里的内容
34     f.close()
35 print('finally')

多分枝

4.万能异常:可以捕获任意异常

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

5.主动触发异常

1 主动抛异常
2 try:
3     raise AttributeError('错啦错啦')
4 except AttributeError as e:
5     print(e)

6.自定义抛出异常

1 class EgonException(BaseException):
2     def __init__(self,msg):
3         self.msg = msg
4     # def __str__(self):   可以不用写这个方法,因为那个BaseException父类里面已经实现了
5     #     return self.msg
6 try:
7     raise EgonException('egon出异常啦')
8 except EgonException as e:
9     print(e)

7.断言

1 断言:一个会抛出异常的判断,这个条件一旦成立就成立了,一旦不成立就报错了,就都不执行下面的了
2 assert 1==2
3 if 1==2:
4     print()
5 print('haha')

try..except的方式比较if的方式的好处

try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性

异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性 

 

使用try..except的方式

1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

什么时候用异常处理

try...except应该尽量少用,因为它本身就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的

这种东西加的多了,会导致你的代码可读性变差,只有在有些异常无法预知的情况下,才应该加上try...except,

其他的逻辑错误应该尽量修正

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124530.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 9. 数仓开发之 DWD 层

    9. 数仓开发之 DWD 层数仓开发之DWD层交易域加购事务事实表DWD层设计要点:DWD层的设计依据:维度建模理论,该层存储维度模型的事实表DWD层的数据存储格式:orc列式存储+snappy压缩DWD层表名的命名规范:dwd_数据域_表名_单分区增量****全量标识(inc/full)交易域加购事务事实表…

  • 敏感词过滤算法:前缀树算法

    敏感词过滤算法:前缀树算法背景平时我们在逛贴吧、牛客网的时候,我们经常可以看到一些形如“***”的符号,通过上下文,我们也可以很容易猜到这些词原来是骂人的话,只是被系统和谐了。那么这是如何实现的呢?作为普通人,我们最先想到的一种办法就是把所有敏感串存入一个列表中,然后用户每发一条内容后台就把该内容与敏感串列表的每一项进行匹配,然后把匹配的字符进行和谐。显然这样的效率是很低的。非常影响性能,那么我们有没有其他的算法…

  • eidos云矿机_空投挖矿

    eidos云矿机_空投挖矿eidos空投矿机虽然已经有几款网页版的了,甚至还有收费的,但并不适合长期运行,特别是需要挂在VPS里,所以就出现了这款控制台运行的,如果觉得对你有帮助就给个star吧。项目地址https://github.com/donjan-deng/eidos-miner环境需求nodejs>=10scatter>=11(网页版可在低版本运行)使用方法也有个简易的网页版…

  • 漏扫工具 nessus_黑客漏洞扫描工具

    漏扫工具 nessus_黑客漏洞扫描工具零基础学黑客,搜索公众号:白帽子左一原文地址:https://blog.csdn.net/wwl012345/article/details/96998187一、Nessus简单介绍Nessus是全球使用人数最多的系统漏洞扫描与分析软件,这是一个免费、威力强大、更新频繁并简易使用的远端系统安全扫描程序,功能十分强大。二、Nessus安装下载软件包的时候一定要找一个网速很好并且稳定的地方,最好不要使用热点,这是前人之鉴。(1):下载软件包进入官网下载https://www.tenable.c

    2022年10月19日
  • 如何将sql文件导入mysql

    第一步:打在开始界面中找到mysql第二步:双击打开mysql软件。,并输入密码。第三步:如果sql文件的内容中有创建数据库的语句或者你想将表存放在你已有的数据库,在这里就不用创建数据库。第四步:输入“showdatabases;”就能看到自己创建的数据库。第五步:输入“use数据库名”,开始使用这个数据库。第六步:开始导入sql文件,输入“sourcesql文件的路径”(注意你的文件路径要…

  • Android之ProgressDialog的使用

    Android之ProgressDialog的使用ProgressDialog继承自AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口。ProgressDialog的创建方式有两种,一种是new

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号