python内建异常类的基类是什么_内建异常类型

本文详细介绍了Python的内建异常类型,包括Exception、StandardError、ArithmeticError等,并展示了如何使用try-except-finally语句进行异常处理。同时,还讲述了如何定义新的异常类,以及assert语句在程序调试中的应用。
摘要由CSDN通过智能技术生成

#!/usr/bin/python

# -*- coding: UTF-8 -*-

# 异常 描述

# Exception 所有内建异常

# SystemExit 由sys.exit()产生

# StandardError 除SystemExit外所有内建异常

# ArithmeticError 所有运算异常

# FloatingPointError 浮点数运算异常

# OverflowError 数值溢出

# ZeroDivisionError 被零除

# AssertionError assert语句引起的异常

# AttributeError 属性名称不可用时引起

# EnvironmentError Python外部错误

# IOError I/O 或与文件有关的错误(输入/输出错误)

# OSError 操作系统错误

# WindowsError Windows错误

# EOFError 当到达一个文件的末尾时引起

# ImportError import语句失败

# KeyboardInterrupt 键盘中断(通常是 Ctrl+C)

# LookupError 索引或关键字错误

# IndexError 超出序列的范围

# KeyError 不存在的字典关键字

# MemoryError 内存不足

# NameError 寻找局部或全局变量时失败

# UnboundLocalError 未绑定变量

# RuntimeError 一般运行时错误

# NotImplementedError 不可实现的特征

# SyntaxError 语法错误

# TabError 不一致的制表符使用 (由 -tt 选项产生)

# IndentationError 缩进错误

# SystemError 解释器致命错误

# TypeError 给一个操作传递了一个不适当的类型

# ValueError 值错误(不合适或丢失)

# UnicodeError Unicode编码错误

#抛出异常 raise exception [, value ]

#excepetion 异常类型 ,value 是对异常的描述

# raise WindowsError,"系统错误"

# raise 如果没有参数,则抛出最近一次发生的异常

# try:

# f=open('foo')

# except IOError,a:#

# print 'Unable to open "foo":',a

# try:

# f=open('foo')

# except: #省略参数表示:捕获一切异常

# print 'an error occurred'

#

# try语句也支持else从句. else从句必须放在最后一个except从句后. 这块代码只在try块中的语句没有引发异常的时候运行.例如:

# try:

# f = open('foo', 'r')

# except IOError:

# print 'Unable to open foo'

# else:

# data = f.read()

# f.close()

# 复制代码

# finally语句定义了在try块中代码的结束操作,例如:

# f = open('foo','r')

# try:

# # Do some stuff

# ...

# finally:

# f.close()

# print "File closed regardless of what happened."

# 复制代码

# finally 语句并不用于捕获异常.它用来指示无论是否发生异常都要执行的语句块。如果没有引起异常,finally块中的语句将在try块中语句执行完毕后执行;如果有异常发生,控制将先传递到finally块中的第一条语句.在这块语句执行完后,异常被自动再次引发,然后交由异常处理语句处理. finally和except语句不能在同一个try语句中出现. Table 5.1列出了Python中定义的全部内建异常类型.(关于异常的更多细节,参见附录A)

#

# 可以通过异常名称来访问一个异常。例如:

# try:

# statements

# except LookupError: # 捕获 IndexError 或 KeyError

# statements

# 或

# try:

# statements

# except StandardError: # 捕获任何内建的异常类型

# statements

# 复制代码

# 1.4. 定义新的异常

#

# 所有的内建异常类型都是使用类来定义的.要定义一个新的异常,就创建一个父类为exceptions.Exception的新类:

# import exceptions

# # Exception class

# class NetworkError(exceptions.Exception):

# def __init__(self,args=None):

# self.args = args

# 复制代码

# args应该像上面那样使用.这样就可以使用raise语句来引发这个异常,并显示出错误返回信息以及诊断,如:

#

# raise NetworkError, "Cannot find host."

#

#

# 通过调用NetworkError("Cannot find host.")可以创建一个NetworkError异常的实例. 如:

# a=NetworkError("Cannot find host.")

# print a #得到 Cannot find host.

# 复制代码

# 如果你使用一个不是 self.args 的属性名或你根本没有这个属性, 异常实例就没有这种行为.

#

# 当使用 raise 语句有意引发一个异常时, raise语句的可选参数将做为该异常的构造函数(__init__()方法)参数.如果异常的构造函数需要一个以上参数,有两种方法可以用来引发这种异常:

# import exceptions

# # Exception class

# class NetworkError(exceptions.Exception):

# def _ _init_ _(self,errno,msg):

# self.args = (errno, msg)

# self.errno = errno

# self.errmsg = msg

#

# # 方法一

# raise NetworkError(1, 'Host not found')

#

# # 方法二

# raise NetworkError, (1, 'Host not found')

# 复制代码

# 基于类的这种异常体制让你能够轻易创建多级异常.例如,前边定义的 NetworkError异常可以用做以下异常的基类:

# class HostnameError(NetworkError):

# pass

#

# class TimeoutError(NetworkError):

# pass

#

# def error3():

# raise HostnameError

#

# def error4():

# raise TimeoutError

#

# try:

# error3()

# except NetworkError:

# import sys

# print sys.exc_type # 打印出异常类型

# 复制代码

# 在这个例子中except NetworkError 语句能捕获任何从NetworkError中继承而来的异常. 通过变量 sys.exc_type可以得到这个特殊异常的名称. sys.exc_info()函数用于返回最近一个异常的信息(不依靠全局变量,属于安全线程).

#

# 1.5. 断言和__debug__

#

# assert语句用来断言某个条件是真的,常用于程序调试. assert语句的一般格式为:

#

# assert test [, data]

#

# test是一个表达式,它返回True或False. 如果test的值为假, assert语句就引发AssertionError异常, 可选的data字符串将被传递给这个异常.例如:

# def write_data(file,data):

# assert file, "write_data: file is None!"

# ...

# 复制代码

# 实际上assert语句在执行时会被实时翻译为下面的代码:

# if __debug__:

# if not (test):

# raise AssertionError, data

# 复制代码

# __debug__是一个内建的只读值,除非解释器运行在最佳化模式(使用 -O 或 -OO 选项),否则它的值总是 True. 虽然__debug__被设计为供 assert 语句使用,你仍然可以在任何自定义调试代码中使用它.

#

# assert 语句不能用于用来确保程序执行正确的场合,因为该语句在最佳化模式下会被忽略掉.尤其不要用assert来检查用户输入. assert语句用于正常情况下应该总是为真的场合;若assert语句引发了异常,那就代表程序中存在bug,是程序员出了问题而不是用户出现了问题.

#

# 如果打算将上边的 write_data() 函数交付给最终用户使用, assert语句就应该使用if语句和错误处理语句来重写.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值