python入门-----异常处理及异常类型

    技术2023-07-05  111

    文章目录

    常见异常TypeError:类型错误SyntaxError:语法错误IndexError: 索引错误NameError :尝试访问一个不存在的变量AssertionError :断言语句(assert)失败AttributeError :尝试访问未知的对象属性KeyError 字典中查找一个不存在的关键字get() ZeroDivisionError :除数为零 处理异常try---excepttry--except----except---except...try---except ----as ---try----except----else---try----except----else----finally 第十章raise语句:创建异常类型10.3 异常10.3.1 处理ZeroDivisionError异常10.3.2 使用try-except代码块10.3.3 使用异常避免崩溃10.3.4 else代码块10.3.5 处理FileNotFoundError异常10.3.6 分析文本10.3.7 使用多个文件10.3.8 失败时一声不吭 10.4 存储数据10.4.1 使用json.dump()和json.load()10.4.2 保存和读取用户生成的数据10.4.3 重构

    常见异常

    AssertionError断言语句(assert)失败AttributeError尝试访问未知的对象属性EOFError用户输入文件末尾标志EOF(Ctrl+d)FloatingPointError浮点计算错误GeneratorExitgenerator.close()方法被调用的时候ImportError导入模块失败的时候IndexError索引超出序列的范围KeyError字典中查找一个不存在的关键字KeyboardInterrupt用户输入中断键(Ctrl+c)MemoryError内存溢出(可通过删除对象释放内存)NameError尝试访问一个不存在的变量NotImplementedError尚未实现的方法OSError操作系统产生的异常(例如打开一个不存在的文件)OverflowError数值运算超出最大限制ReferenceError弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象RuntimeError一般的运行时错误StopIteration迭代器没有更多的值SyntaxErrorPython的语法错误IndentationError缩进错误TabErrorTab和空格混合使用SystemErrorPython编译器系统错误SystemExitPython编译器进程被关闭TypeError不同类型间的无效操作UnboundLocalError访问一个未初始化的本地变量(NameError的子类)UnicodeErrorUnicode相关的错误(ValueError的子类)UnicodeEncodeErrorUnicode编码时的错误(UnicodeError的子类)UnicodeDecodeErrorUnicode解码时的错误(UnicodeError的子类)UnicodeTranslateErrorUnicode转换时的错误(UnicodeError的子类)ValueError传入无效的参数ZeroDivisionError除数为零

    TypeError:类型错误

    不同类型间的操作出现的错误 例1

    1 + '1' TypeError: unsupported operand type(s) for +: 'int' and 'str'

    例2

    age = input('请输入你的年龄') if age >= 18: print('成年人...')

    SyntaxError:语法错误

    Python的语法错误 例1

    print'胡猪猪' SyntaxError: invalid syntax

    IndexError: 索引错误

    索引超出序列的范围

    my_list = [1, 2, 3] # 这里是0到2的索引 my_list[3] IndexError: list index out of range

    NameError :尝试访问一个不存在的变量

    fishc NameError: name 'fishc' is not defined

    AssertionError :断言语句(assert)失败

    my_list = ['胡猪猪是猪'] assert len(my_list) > 0 my_list.pop() #列表只有一个元素,删除了就为0 assert len(my_list) > 0 Traceback (most recent call last): File "C:/Users/zdb/PycharmProjects/untitled/temp.py", line 4, in <module> assert len(my_list) > 0 AssertionError

    AttributeError :尝试访问未知的对象属性

    my_list = ['胡猪猪是猪'] assert len(my_list) > 0 my_list.fishc #fishc不知道是什么,访问失败 AttributeError: 'list' object has no attribute 'fishc'

    KeyError 字典中查找一个不存在的关键字

    my_dict = {'one':1, 'two':2, 'three':3} my_dict['one'] my_dict['four'] KeyError: 'four'

    不报错解决方法:

    get()

    my_dict = {'one':1, 'two':2, 'three':3} print(my_dict.get('four')) None

    ZeroDivisionError :除数为零

    5 / 0 ZeroDivisionError: division by zero

    处理异常

    例:代码出错,程序终止

    f = open('我为什么是一个文件.txt') #没有这个文件 print(f.read()) #输出文件里面的内容 f.close() #关闭文件 FileNotFoundError: [Errno 2] No such file or directory: '我为什么是一个文件.txt'

    为了解决上述代码终止运行的问题,这里进行异常处理

    try—except

    try: f = open('我为什么是一个文件.txt') print(f.read()) f.close() except OSError: # 如果上面代码出现这个异常 print('文件出错了') 文件出错了

    try–except----except—except…

    如果可能出现多个异常,可以使用多个except 例:

    try—except ----as —

    as后面是错误原因

    try: f = open('我为什么是一个文件.txt') print(f.read()) f.close() except OSError as reason: # 出现这个异常,执行下面语句 print('文件出错了\n错误的原因是:' + str(reason)) 文件出错了 错误的原因是:[Errno 2] No such file or directory: '我为什么是一个文件.txt'

    try: sum = 1+'1' except TypeError as reason: print('类型出错了\n错误的原因是:' + str(reason)) 类型出错了 错误的原因是:unsupported operand type(s) for +: 'int' and 'str'

    try----except----else—

    try: int('123') except ValueError as reason: print('出错了!' + str(raeson)) # 出现valueerror异常输出这个 else: print('没有任何异常!') #没有异常输出这句 没有任何异常!

    try----except----else----finally

    finally后面的语句是无论try里面的代码出不出错都会执行的 例1:

    try: f = open('data.txt', 'w') #写入的方式打开 for each_line in f: print(each_line) #输出内容 except OSError as reason: print('出错了:' + str(reason)) finally: #finally定会执行 f.close() 出错了:not readable

    例2

    try: with open('data.txt', 'w') as f: #相当于f=open() for each_line in f: print(each_line) except OSError as reason: #打开一个不存在的文件 print('出错了:' + str(reason)) finally: f.close() 出错了:not readable

    第十章

    raise语句:创建异常类型

    1/0 1/0 ZeroDivisionError: division by zero raise ZeroDivisionError raise ZeroDivisionError ZeroDivisionError raise ZeroDivisionError('除数为零的异常') raise ZeroDivisionError('除数为零的异常') ZeroDivisionError: 除数为零的异常

    10.3 异常

    程序将停止,并显示一个traceback。

    10.3.1 处理ZeroDivisionError异常

    print(5/0)

    10.3.2 使用try-except代码块

    使用了try-except代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息。 如果try-except代码块后面还有其它代码,程序将接着运行。

    try: print(5/0) except ZeroDivisionError: print("You can't divide by zero")

    10.3.3 使用异常避免崩溃

    print("Give me two numbers, and I'll divide them.") print("Enter 'q' to quit.") while True: first_number = input("\nFirst number: ") if first_number == 'q': break second_number = input("Second number: ") if second_number == 'q': break answer = int(first_number) / int(second_number) print(answer)

    10.3.4 else代码块

    依赖try代码块成功执行的代码都放在else代码块中

    print("Give me two numbers, and I'll divide them.") print("Enter 'q' to quit.") while True: first_number = input("\nFirst number: ") if first_number == 'q': break second_number = input("Second number: ") try: answer = int(first_number) / int(second_number) except ZeroDivisionError: print("You can't divide by 0!") else: print(answer) Give me two numbers, and I'll divide them. Enter 'q' to quit. First number: 5 Second number: 0 You can't divide by 0! First number: 5 Second number: 2 2.5 First number: q 进程已结束,退出代码0

    10.3.5 处理FileNotFoundError异常

    找不到文件,文件在其它地方,或者根本不存在

    filename = 'alice.txt' with open(filename) as f_obj: contents = f_obj.read()

    filename = 'alice.txt' try: with open(filename) as f_obj: contents = f_obj.read() except FileNotFoundError: msg = "Sorry, the file " + filename + " does not exist." print(msg) Sorry, the file alice.txt does not exist.

    10.3.6 分析文本

    title = "Alice in Wonderland" print(title.split()) ['Alice', 'in', 'Wonderland']

    计算文本中有多少个单词

    filename = 'alice.txt' try: with open(filename) as f_obj: contents = f_obj.read() except FileNotFoundError: msg = "Sorry, the file " + filename + " does not exist." print(msg) else: # 计算文件大致包含多少个单词 words = contents.split() num_words = len(words) print("The file " + filename + " has about " + str(num_words) + "words.")

    10.3.7 使用多个文件

    def count_words(filename): """计算一个文件大致包含多少个单词""" try: with open(filename) as f_obj: contents = f_obj.read() except FileNotFoundError: msg = "Sorry, the file " + filename + " does not exist." print(msg) else: # 计算文件大致包含多少个单词 words = contents.split() num_words = len(words) print("The file " + filename + " has about " + str(num_words) + "words.") filename = 'alice.txt' count_words(filename)

    多分析几本书:def定义不变,修改后面的实例

    filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt'] for filename in filenames: count_words(filename)

    10.3.8 失败时一声不吭

    修改except模块里面的代码,修改成pass, 代码出错python就什么都不会做,不会traceback,也不会有任何输出。

    10.4 存储数据

    模块json让你能够将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。还可以在python程序之间分享数据,在其它语言之间也能分享。

    10.4.1 使用json.dump()和json.load()

    1、函数json.dump()接受两个参数:要存储的数据以及可用于存储数据的文件对象。

    import json numbers = [2, 3, 5, 7, 11, 13] filename = 'numbers.json' with open(filename, 'w') as f_obj: #写入的方式打开,用f_obj表示 json.dump(numbers,f_obj) #两个参数,存储的数据,文件对象

    2、使用json.load()将这个列表读取到内存中

    import json filename = 'numbers.json' with open(filename) as f_obj: #写入的方式打开,用f_obj表示 numbers = json.load(f_obj) print(numbers)

    10.4.2 保存和读取用户生成的数据

    用户首次运行程序时被提示输入自己的名字,这样再次运行程序时就记住他了。

    import json username = input("What is your name? ") filename = 'username.json' with open(filename, 'w') as f_obj: json.dump(username, f_obj) #输入的名字存储进了文件里面 print("We'll remember you when you come back, " + username + "!") What is your name? huzhuzhu We'll remember you when you come back, huzhuzhu!

    使用存储了名字的文件

    import json filename = 'username.json' with open(filename) as f_obj: username = json.load(f_obj) print("Welcome back, " + username + "!") Welcome back, huzhuzhu!

    合起来

    import json #如果以前存储了用户名,就加载它 #否则,就提示用户输入用户名并存储它 filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input("What is your name? ") with open(filename, 'w') as f_obj: json.dump(username, f_obj) # 输入的名字存储进了文件里面 print("We'll remember you when you come back, " + username + "!") else: print("Welcome back, " + username + "!")

    输出

    What is your name? huzhuzhu We'll remember you when you come back, huzhuzhu!

    或者输出

    Welcome back, huzhuzhu!

    10.4.3 重构

    代码能够正常运行,但可做进一步的改进----将代码划分成一系列完成具体工作的函数。这样的过程被称为重构。 重构让代码更清晰、更易于理解、更容易扩展。

    1、将所有内容放在一个函数里面

    import json def greet_user(): """问候用户,并指出其名字""" filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: username = input("What is your name? ") with open(filename, 'w') as f_obj: json.dump(username, f_obj) # 输入的名字存储进了文件里面 print("We'll remember you when you come back, " + username + "!") else: print("Welcome back, " + username + "!") greet_user()

    2、将所有内容分别放在两个函数里面

    import json def get_stored_username(): """如果存储了用户名,就获取它""" filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return username def greet_user(): """问候用户,并指出其名字""" username = get_stored_username() #创建第一个函数的实例,赋值给username if username: print("Welcome back, " + username + "!") else: username = input("what is your name? ") filename = 'username.json' with open(filename, 'w') as f_obj: json.dump(username, f_obj) print("We'll remember you when you come back, " + username + "!") greet_user()

    3、将所有内容分别放在三个函数里面

    import json def get_stored_username(): """如果存储了用户名,就获取它""" filename = 'username.json' try: with open(filename) as f_obj: username = json.load(f_obj) except FileNotFoundError: return None else: return username def get_new_username(): """提示用户输入用户名""" username = input("What's your name?") filename = 'username.json' with open(filename, 'w') as f_obj: json.dump(username, f_obj) return username def greet_user(): """问候用户,并指出其名字""" username = get_stored_username() #创建第一个函数的实例,赋值给username if username: #非空 print("Welcome back, " + username + "!") else: username = get_new_username() #创建第二个函数的实例,赋值给username print("We'll remember you when you come back, " + username + "!") greet_user()
    Processed: 0.015, SQL: 9