Python 异常处理



# coding = utf-8


##########################################################################

# 1. 异常
# python使用异常对象来表示异常状态,并在遇到错误时引发异常。
# 异常状态未被处理(未被捕获)时,程序将会终止并显示一条消息(traceback)

# 2. 引发异常
# 2.1 raise语句
# 要引发异常可使用raise语句,并将一个类(必须是Exception的子类)或实例作为参数,
# 将类作为参数时,将自动创建一个实例

# raise Exception
# raise Exception('Error!!!')

# 内置常用异常类
Exception            #几乎所有的异常类都是由它派生出来的
AttributeError       #引用属性或给它赋值失败时引发
OSError              #操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
IndexError           #使用序列中不存在的索引时引发,为LookupError的子类
KeyError             #使用映射中不存在的键时引发,为LookupError的子类
NameError            #找不到名称(变量)时引发
SyntaxError          #代码不正确时引发
TypeError            #将内置操作或函数用于类型不正确的对象时引发
ValueError           #将内置操作或函数用于类型正确但值不合适的对象时引发
ZeroDivisionError    #在除法或求模运算的第二个参数为零时引发


# 2.2 自定义异常类
class SomeCustomException(Exception):
    pass



##########################################################################

# 3. 捕获异常
# try/except 语句

try:
    x = int(input('Enter a num:'))
    y = int(input('Enter a num:'))
    print(x/y)

except ZeroDivisionError:
    print("The second num can't be zero")

print()

# 3.1 不用提供参数
# 捕获异常后,如果要重新引发它(即继续向上传播),可调用raise且不提供任何参数(也可以显示的提供捕获到的异常)
class MuffledCalculator:
    muffled = False
    def calc(self, expr):
        try:
            return eval(expr)
        except ZeroDivisionError:
            if self.muffled:
                print('Divison by zero is illegal')
            else:
                raise

calculator = MuffledCalculator()
calculator.calc('10/2')

# 如果无法处理异常,在except子句中使用不带参数的raise通常是不错的选择
# 但有时你可能想引发别的异常。在这种情况下
# 进入except子句的异常将被作为上下文存储起来,并出现在最终的错误消息中

# try:
#     1/0
# except ZeroDivisionError:
#     raise ValueError


# 可以使用raise...from...语句来提供自己的异常上下文,也可以使用None来禁止上下文

# try:
#     1/0
# except ZeroDivisionError:
#     raise ValueError from None


# 3.2 多个except子句
try:
    x = int(input('enter a num'))
    y = int(input('enter a num'))
    print(x/y)
except ZeroDivisionError:
    print("The second num can't be zero")
except TypeError:
    print("That was't a number,was it?")

print()


# 3.3 一个except语句处理多种异常

try:
    x = int(input('enter a num:'))
    y = int(input('enter a num:'))
    print(x/y)
except (ZeroDivisionError,ValueError,TypeError):
    print('Your numbers were bogus...')

# 在except子句中,异常两边的圆括号很重要


# 3.4 捕获异常对象
# 要在except子句中访问异常对象本身,可使用两个而不是一个参数
# (注意:即便在你捕获多个异常时,也只向except提供了一个参数--一个元组)

try:
    x = int(input('Enter a num:'))
    y = int(input('Enter a num:'))
    print(x/y)
except (ZeroDivisionError, TypeError) as e:
    print(e)
print()


# 3.5 栈跟踪
# 如果你要使用一段代码来捕获所有的异常,只需在except语句中不指定任何异常

# 3.6 给try/except 语句添加一个else语句

while True:
    try:
        x = int(input('Enter a num:'))
        y = int(input('Enter a num:'))
        print(x / y)
    except Exception as e:
        print(e)
    else:
        break

print()


# 3.7 finally 子句
# finally 子句可用于在发生异常时执行清理工作
# 不管try子句发生什么都执行finally
x = None
try:
    x = 1/2
finally:
    print('Cleaning up')
    del x
print()


try:
    1/0
except ZeroDivisionError:
    print("0")
else:
    print("good")
finally:
    print('Cleaning up')

print()

############################################################################

# 4. 异常和函数
# 如果不处理函数里的异常,那异常会继续向上传播到调用函数的地方,如果那里也没有处理,异常将继续传播
# 直到主程序(全局作用域),如果主程序也没有处理异常,程序将终止并显示栈跟踪消息

def describe_person(person):
    try:

        print('Description of',person['name'])
        print('Age:',person['age'])

    except KeyError:pass

print()

# 5. 警告
from warnings import warn
warn("Warning")
print()

# 函数filterwarnings 可以抑制你发出的警告,并指定要采取的措施(error 或 ignore)
from warnings import filterwarnings
filterwarnings('ignore')
warn('Warning')

filterwarnings('error')
warn('Error')

你可能感兴趣的:(Python 异常处理)