pyhon---异常处理

1.常见的异常


# # NameError
# print(a)


# # IndexError: 索引错误
# li = [1,2,3,4]
# print(li[8])


# # KeyError
# d = dict(a=1, b=2)
# print(d['f'])

# # ZeroDivisionError: 除0错误
# print(10/(2-2))


# class Student(object):
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#     def echo(self):
#         print(self.name, self.age)
#
# # AttributeError: 对象没有该属性
# s1 = Student("westos", 10)
# # print(s1.scores)
# # s1.echo()
# # s1.echo1()

# # FileNotFoundError
# with open('/tmp/passwd9') as f:
#     print(f.read(5))

# 总结: 在程序运行过程中影响程序正常运行的内容, 称为异常.

2._try_except语句

# python:try....except......finally......



# try:
#     print(a)
# # 如果出现NameError时, 不报错, 只显示except语句里面执行的内容.
# except NameError:
#     print("name error")
# print("hello")
# print("hello1 ")


# 捕获异常
try:
    f = open("hello.txt", 'w')
    f.write("这是一个测试文件")
# 注意: except语句不一定会执行, 只有在try语句中出现IOError报错时, 才会执行.
except IOError as e:
    print(e)
    # print("没有找到文件或者文件读取失败")
# 如果没有捕获到异常, 则执行else语句的内容
else:
    print("文件内容写入成功")
# 无论是否捕获到异常, 都执行的语句.
finally:
    f.close()
    print("文件已经关闭")


#
# f = open("hello.txt", 'w')
# f.write("这是一个测试文件")

3.不指定异常类型的except使用

try:
    f = open('hello.txt')
    # f.write("这是一个测试文件")
    f.read()
# 不建议捕获所有的异常, 因能不能定位错误的位置.
except:
    print("捕获所有的异常....")
else:
    print("如果没有捕获到异常, 执行else语句")
finally:
    f.close()
    print("有异常或者没有异常都会执行")

4.捕获多个异常

# 异常处理
# assert(断言):
# NameError, KeyError


# try:
#     d = dict(a=1, b=2)
#     print(d['f'])  # KeyError
#     print(a)  # NameError
# except KeyError as e:
#     print(e)
# except NameError as e:
#     print(e)
# else:
#     print("没有产生异常")
# finally:
#     print("无论是否产生异常的清理操作")
#
# print("new start")


try:
    d = dict(a=1, b=2)
    print(d['f'])  # KeyError
    print(a)  # NameError
except (KeyError, NameError) as e:
    print(e)
else:
    print("没有产生异常")
finally:
    print("无论是否产生异常的清理操作")
print("new start")

5.抛出异常_触发异常

# raise: 关键字, 用来抛出异常.
# raise 抛出异常的名称, 抛出异常的详细显示



#
# def get_age(age):
#     if 0 < age <= 200:
#         print(age)
#     else:
#         # 如果raise抛出异常, 程序后面的代码不会再执行.
#         raise  Exception('invaild age')
# get_age(1000)
# get_age(100)


# ************自定义异常类********************
# 所有的异常实际上是一个类, 所以异常的父类都是BaseException.
# IOError, IndexError, KeyError, FileExistsError

class AgeError(BaseException):
    pass

def get_age(age):
    if 0 < age <= 200:
        print(age)
    else:
        # 如果raise抛出异常, 程序后面的代码不会再执行.
        raise  AgeError('invaild age')
get_age(1000)
get_age(100)

6.异常案例

# ctrl+r 进入批量替换的界面;
#

while True:
    try:
        x = int(input("Please enter a number: "))
        break
    except ValueError:
        print("Oops!  That was no valid number.  Try again")

7.抛出异常与继承

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        # 抛出异常
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")

8.断言

# raise:


# age = int(input('Age:'))
# # assert 1 == 1
# # assert 1 != 1
# assert 0 < age < 100, "年龄不合法"

# if 1!=1:
#     raise  AssertionError


def is_huiwen_num(num):
    snum = str(num)
    return snum == snum[::-1]


# 如果希望程序中的所有assert语句不执行, 那么给python -O 脚本名
if __name__ == "__main__":
    assert is_huiwen_num(100) == True, "error"
    assert  is_huiwen_num(101) == True
    print("assert")

import  unittest

9.logging模块

import logging
s = '0'
n = int(s)
# 配置日志的信息:
#   1). 日志级别: debug, info, warning, error, critical
#   2). level: 指日志级别为info及以上的日志信息会被记录到文件中;
#   3). format: 指定日志的格式, 可以去logging.Formatter查看参考信息
logging.basicConfig(filename="hello.log",level=logging.INFO,
                    format="%(asctime)s -  %(filename)s[%(lineno)d] - %(levelname)s:  %(message)s")
logging.debug("this is a debug info")
logging.info("this is a  info")
logging.warning("这是一条警告信息")
# logging.info('n=%d' %n)
# print(10/n)

10.pdb_调试代码

import pdb

def pdb_run(args):  # 4
    for i in range(args):  # [0,1,2,3]
        pdb.set_trace()
        print(i)

    return  args  # 4

pdb.run("pdb_run(4)")

猜你喜欢

转载自blog.csdn.net/suifengOc/article/details/82353492