day20 异常处理

异常处理:
  一、语法错误

  二、逻辑错误

为什么要进行异常处理?

  python解释器执行程序时,检测到一个错误,出发异常,异常没有被处理的话,程序就在当前异常处终止,后面的代码不会运行  

l = ['login','register']
for num,i in enumerate(l,1):
    print(num,i)

try:         处理异常用try 
    num = int(input('num >>>'))       中间时可能出现错误的代码
    print(l[num - 1])
except (ValueError,IndexError) :     可能出现的两种错误
    print('您输入的内容不合法')

万能异常处理:

try:
    pass
except (ValueError,IndexError):
    print('针对性的处理')
except Exception as e:  万能异常处理
    print(e)           打印异常的错误类型
    print('通用性的处理')
# by luffycity.com
# 什么是异常
# IndexError   [][1]
# KeyError    {}['key']
# pickle.load() EOFError
# FileNotFoundError open('aa')
# ModuleNotFoundError import aaaaaaaaaaa
# ValueError int('sdjkhf')

# 语法错误 应该在写代码的时候就规避掉
# SyntaxError
# NameError name

# 什么时候最容易出异常
# 当你要处理的内容不确定的时候
    # 有用户参与
    # 有外界数据接入 : 从文件中读 从网络上获取


# 当有多行报错的时候是为什么?
# def func1():
#     name
#
# def func2():
#     func1()
#
# def main():
#     func2()
#
# main()
# 在嵌套调用的过程中,内部的代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部分

# 怎么解决
# 从下往上找 首先找到你写的代码 出错的那一行
# 看看能不能看出问题
# 就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题

# 单分支
# l = ['login','register']
# for num,i in enumerate(l,1):
#     print(num,i)
#
# try:
#     num = int(input('num >>>'))
#     print(l[num - 1])
# except ValueError :      # except处理的异常必须和实际报错的异常是相同的
#     print('请输入一个数字')
# print(l[num - 1])

# 多分支
# l = ['login','register']
# for num,i in enumerate(l,1):
#     print(num,i)
#
# try:
#     num = int(input('num >>>'))
#     print(l[num - 1])
# except ValueError :
#     # 从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支
#     print('请输入一个数字')
# except IndexError :
#     # 如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没有找到就会报错
#     print('只能输入1或2')

# 多分支合并
# l = ['login','register']
# for num,i in enumerate(l,1):
#     print(num,i)
#
# try:
#     num = int(input('num >>>'))
#     print(l[num - 1])
# except (ValueError,IndexError) :
#     print('您输入的内容不合法')


# 万能异常
# def buy():
#     print('buy')
#     name
#
# def back():
#     print('back')
#     [][1]
#
# def show():
#     print('show')
#     1/0
#
# def main():
#     l = [('购物',buy),('退货',back),('查看订单',show)]
#     while True:
#         for num,i in enumerate(l,1):
#             print(num,i[0])
#         num = int(input('num >>>'))
#         print(l[num - 1])
#         try:
#             func = l[num - 1][1]
#             func()
#         except Exception:
#             print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
#
# main()


# as语法  能够将具体错误信息打印出来
# def buy():
#     print('buy')
#     name
#
# def back():
#     print('back')
#     [][1]
#
# def show():
#     print('show')
#     1/0
#
# def main():
#     l = [('购物',buy),('退货',back),('查看订单',show)]
#     while True:
#         for num,i in enumerate(l,1):
#             print(num,i[0])
#         num = int(input('num >>>'))
#         print(l[num - 1])
#         try:
#             func = l[num - 1][1]
#             func()
#         except Exception as e:
#             print(e)
#             #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)
#             print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
#
# main()

# 万能异常,相当于except Exception
# try:
#     name
#     [][1]
#     int('aaa')
# except:
#     print(123)

# 多分支 + 万能异常 : 万能异常应该永远放在异常处理的最下面
# def buy():
#     print('buy')
#     name
#
# def back():
#     print('back')
#     [][1]
#
# def show():
#     print('show')
#     1/0
#
# def main():
#     l = [('购物',buy),('退货',back),('查看订单',show)]
#     while True:
#         for num,i in enumerate(l,1):
#             print(num,i[0])
#         try:
#             num = int(input('num >>>'))
#             print(l[num - 1])
#             func = l[num - 1][1]
#             func()
#         except (ValueError,IndexError) :
#             print('您输入的内容不合法')
#         except Exception as e:
#             print(e)
#             #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)
#             print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
# main()

try:
    pass
except (ValueError,IndexError):
    print('针对性的处理')
except Exception as e:
    print(e)
    print('通用性的处理')
View Code

异常其它处理:

except NameError:   # 网络不稳定,邮箱地址错误
    print('name error')
except IndexError:
    print('index error')
except Exception as e:
    print('Exception')
else:  # 当try中的代码不发生异常的时候 走else分支  如果发送成功了 进行一些处理
    print('else')
finally: # 无论如何都会被执行  
print('finally')

finally 应用

try:
    f = open('www','w')
    f.read()
finally:   # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序
    f.close()
    print('文件已经关闭了')
# finally用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
异常处理的几种情况
try ... except
try ... except ... else
try ... finally
try ... except ... finally
try ... except ... else ... finally

  

主动抛出异常:

  raise ValueError

主动异常
 1 # by luffycity.com
 2 # else分支
 3 # try:
 4 #     print('aaa')  # 给某某某发邮件
 5 #     # name
 6 #     # [][1]
 7 #     # 1/0
 8 except NameError:   # 网络不稳定,邮箱地址错误
 9     print('name error')
10 except IndexError:
11     print('index error')
12 except Exception as e:
13     print('Exception')
14 else:  # 当try中的代码不发生异常的时候 走else分支  如果发送成功了 进行一些处理
15     print('else')
16 
17 # finally分支
18 # try:
19 #     print('aaa')  # 给某某某发邮件
20 #     name
21 #     # [][1]
22 #     # 1/0
23 # except NameError:   # 网络不稳定,邮箱地址错误
24 #     print('name error')
25 # except IndexError:
26 #     print('index error')
27 # except Exception as e:
28 #     print('Exception')
29 # else:  # 当try中的代码不发生异常的时候 走else分支  如果发送成功了 进行一些处理
30 #     print('else')
31 finally: # 无论如何都会被执行
32     print('finally')
33 
34 # def func():
35 #     f = open('file')
36 #     try:
37 #         while True:
38 #             for line in f:
39 #                 if line.startswith('a'):
40 #                     return line
41 #     except:
42 #         print('异常处理')
43 #     finally:   # 即使return也会先执行fianlly中的代码
44 #         f.close()
45 
46 try:
47     f = open('www','w')
48     f.read()
49 finally:   # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序
50     f.close()
51     print('文件已经关闭了')
52 
53 # finally用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
54 
55 异常处理的几种情况
56 try ... except
57 try ... except ... else
58 try ... finally
59 try ... except ... finally
60 try ... except ... else ... finally
61 
62 # 主动抛出异常 : 是给其他开发者用的
63 # raise ValueError
64 # raise ValueError('你写的不对')
65 # django是别人写的程序 框架 --> 程序员用
66 
67 # 断言 - 语法
68 # assert 1==2  # 只能接受一个布尔值  False
69 # assert 1==1  # 只能接受一个布尔值  False
70 # print(123456)
71 # if 1 == int(input()):
72 #     pass
73 # else:
74 #     raise AssertionError
75 
76 
77 # 自定义异常 :面向对象之后
78 
79 # 异常处理的忠告,在最外层的异常处理应该在所有的开发结束之后才放
80 # main()
81     #sdhjlkghl
82 
83 # try:
84 #     main()
85 # except Exception as e:
86 #     把e报错写到文件里
View Code

  

猜你喜欢

转载自www.cnblogs.com/xiaobai686/p/11721293.html