Python抛出异常_python抛出异常的作用

Python抛出异常_python抛出异常的作用在工作中都会遇到异常报错问题,那么在这抽空码一些内容以作记录。在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误AttributeError#试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError#输入/输出异常;基本上是无法打开文件ImportError#无法引入模块或包;基本上是路径问题或名称错误Indentati.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在工作中都会遇到异常报错问题,那么在这抽空码一些内容以作记录。

 

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

如何处理异常:

python解释器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行

#一个简单得例子,

>>> Print("Hello World")


Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    Print("Hello World")
NameError: name 'Print' is not defined

NameError 错误被抛出,同时 Python 还会打印出检测到的错误发生的位置。这就是一个错误处理器
 

程序运行中的异常可以分为两类:语法错误和逻辑错误。首先,我们必须知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。

使用if判断式可以异常处理,但是if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。而且在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差

#我们平时用if做的一些简单的异常处理
num1=input('>>: ') #输入一个字符串试试
if num1.isdigit():
    int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
elif num1.isspace():
    print('输入的是空格,就执行我这里的逻辑')
elif len(num1) == 0:
    print('输入的是空,就执行我这里的逻辑')
else:
    print('其他情情况,执行我这里的逻辑')
#这些if,跟代码逻辑并无关系,显得可读性极差,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。

python特定的语法结构捕获异常

#异常捕获 单个分支
try:
     逻辑代码(被捕获得内容)
except 异常类型:
     检测到异常,就执行这个位置的逻辑

 
# 多个分支捕获
# 单分支只能用来处理指定的异常情况,如果未捕获到异常,则报错
try:
    abc()
except ValueError:
    print('异常输出')
except IndexError:
    print('异常输出')


# Exception 属性可以捕获任意异常,不过它是一把双刃剑,有利有弊,我们要视情况使用
try:
     abc()
except Exception as e:
     print(e)检测到异常,就执行这个位置的逻辑




# try...else语句

try:
     abc()
except Exception as e:
     print(e)
else:
    print('') #当try语句中的代码没有异常,就执行else中的代码



# try...finally语句

try:
     abc()
except Exception as e:
     print(e)
finally:
    print('') #不论try中有没有异常,finally都会执行




#自主出发异常  关键字 raise
try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)





断言处理
assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

语法:
       

assert expression[,reason]

assert 表达式 [, 参数]

        assert语句一般用于对程序某个时刻必须满足的条件进行验证,仅当”debug” 为True时有效。当PYthon脚本以_()选项编译为字节码文件是,assert语句将被移除以提高运行速度。

>>> assert len([1,2,3,4,5,6]) >=5  #列表元素个数小于5
>>> assert 2==1   #2不等于1

Traceback (most recent call last):
  File "<stdin>", line 25, in <module>
    assert 2==1   #2不等于1
AssertionError




# 格式:assert  条件  , 条件为false时的错误信息, 结果为raise一个AssertionError出来

 

用sys模块回溯最后的异常

当发生异常时Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这是可以使用sys模块回溯最近一次异常。语法为:

import sys
try:
    block
except:
    t==sys.exc_info()
    print(t)


"""
sys.exc_info()返回值是一个三元组(type,value/message,traceback)。其中,type表示异常的类型,value/message表示异常的信息或者参数,而traceback则包含调用栈信息的对象。
        sys.exc_info()可以直接定位最终引发异常的原因,结果比较简洁,但是缺点是难以直接确定引发异常的代码位置
"""

 

raise

语法结构:

raise [exceptionName [(reason)]]

其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。

每次执行 raise 语句,都只能引发一次执行的异常。

#举个简单例子
try:
    a = 2
    #判断是否为 1
    if a != 1:
        raise ValueError("a 不为 1")
except ValueError as e:
    print("引发异常:",repr(e))



"""
运行结果为:
引发异常: ValueError('a 不为 1',)
"""

 

自定义异常

#定义一个异常类,继承Exception
class Networkerror(Exception):
   def __init__(self):
       pass
   def __str__(self):
       return "这是一个异常说明!"


try:
   raise Networkerror()  # raise 出这个异常
except Networkerror as e:
   print(e)

"""
输出: 这是一个异常说明!
"""

 

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

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

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

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

(0)


相关推荐

  • 操作系统虚拟存储技术_虚拟存储

    操作系统虚拟存储技术_虚拟存储虚拟存储管理   在前面总结了集中存储管理的刚上,要求作业的逻辑地址空间连续的存放主存储器的某个区域中。当主存储器中没有足够大的区域是,则作业是无法装入的,或必须移动某些作业后才能装入。是否有可能吧作业的连续逻辑地址空间分散到几个不连续的主存区域,且仍能使作业正确执行呢?若可行的话,则可充分利用主存空间有可减少移动所花费的开销。不仅如此,还可采用虚拟存储管理技

  • hdu4288 Coder(段树+分离)

    hdu4288 Coder(段树+分离)

  • 动态迁移_动作迁移

    动态迁移_动作迁移概念在虚拟化环境中的迁移,又分为动态迁移,静态迁移,也有人称之为冷迁移和热迁移,或者离线迁移在线迁移;静态迁移和动态迁移的区别就是静态迁移明显有一段时间客户机的服务不可用,而动态迁移则没有明显的服务暂停时间,静态迁移有两种1,是关闭客户机将其硬板镜像复制到另一台宿主机系统,然后回复启动起来,这种迁移不保留工作负载,2是,两台客户机公用一个存储系统,关闭一台客户机,防止其内存到另一台宿主机,这样做的

    2022年10月25日
  • Java程序设计(高级及专题)- 泛型/容器(集合框架)

    Java程序设计(高级及专题)- 泛型/容器(集合框架)Java程序设计(高级及专题)- 泛型/容器(集合框架)

  • MYSQL中建议使用NOT NULL原因[通俗易懂]

    MYSQL中建议使用NOT NULL原因[通俗易懂]MySQL官网文档:NULLcolumnsrequireadditionalspaceintherowtorecordwhethertheirvaluesareNULL.ForMyISAMtables,eachNULLcolumntakesonebitextra,roundeduptothenearestbyte.Mysql难以…

  • ENVI5.3.1使用Landsat 8影像进行图像融合「建议收藏」

    ENVI5.3.1使用Landsat 8影像进行图像融合「建议收藏」ENVI处理郑州地区遥感图像融合,提高空间分辨率

发表回复

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

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