异常处理

发布时间 2023-12-04 22:02:55作者: 我才是最帅的那个男人

一,可避免语法异常

  • SyntaxError
    1 if x > 10  #if后面没有冒号
    2     print("x is greater than 10")
  • NameError name,变量名字取得有问题

二,难点异常

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

  多行报错;

def func1():
    name

def func2():
    func1()

def main():
    func2()

main()
#在嵌套调用的过程中,内部的代码出了问题,外部所有的调用的地方都成为报错追溯信息的一部分

  解决方案:

 

  • 从下往上找 首先找到你写的代码 出错的那一行看看能不能看出问题
    就把报错的最后一行 错误类型和详细提示贴到百度里,结合报错的那一行解决问题
  • 单分支
     1 l = ['login','register']
     2 for num,i in enumerate(l,1):
     3     print(num,i)
     4 
     5 try:
     6     num = int(input('num >>>'))
     7     print(l[num - 1])
     8 except ValueError :
     9     # 从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支
    10     print('请输入一个数字')
    11 except IndexError :
    12     # 如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没有找到就会报错
    13     print('只能输入1或2')
    单分支
  • 多分支
     1 l = ['login','register']
     2 for num,i in enumerate(l,1):
     3     print(num,i)
     4 
     5 try:
     6     num = int(input('num >>>'))
     7     print(l[num - 1])
     8 except ValueError :
     9     # 从上向下报错的代码只要找到一个和报错类型相符的分支就执行这个分支中的代码,然后直接退出分支
    10     print('请输入一个数字')
    11 except IndexError :
    12     # 如果找不到能处理和报错类型相同的分支,会一直往下走,最后还是没有找到就会报错
    13     print('只能输入1或2')
    多分支
  • 多分支合并
    1 l = ['login','register']
    2 for num,i in enumerate(l,1):
    3     print(num,i)
    4 
    5 try:
    6     num = int(input('num >>>'))
    7     print(l[num - 1])
    8 except (ValueError,IndexError) :
    9     print('您输入的内容不合法')
    多分支合并
  • 万能异常
     1 def buy():
     2     print('buy')
     3     name
     4 
     5 def back():
     6     print('back')
     7     [][1]
     8 
     9 def show():
    10     print('show')
    11     1/0
    12 
    13 def main():
    14     l = [('购物',buy),('退货',back),('查看订单',show)]
    15     while True:
    16         for num,i in enumerate(l,1):
    17             print(num,i[0])
    18         num = int(input('num >>>'))
    19         print(l[num - 1])
    20         try:
    21             func = l[num - 1][1]
    22             func()
    23         except Exception:
    24             print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
    25 
    26 main()
    万能异常
  • as语法,可以将异常打印出来
     1 def buy():
     2     print('buy')
     3     name
     4 
     5 def back():
     6     print('back')
     7     [][1]
     8 
     9 def show():
    10     print('show')
    11     1/0
    12 
    13 def main():
    14     l = [('购物',buy),('退货',back),('查看订单',show)]
    15     while True:
    16         for num,i in enumerate(l,1):
    17             print(num,i[0])
    18         num = int(input('num >>>'))
    19         print(l[num - 1])
    20         try:
    21             func = l[num - 1][1]
    22             func()
    23         except Exception as e:
    24             print(e)
    25             #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)
    26             print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
    27 
    28 main()
    View Code
  •  多分支 + 万能异常 : 万能异常应该永远放在异常处理的最下面
     1 def buy():
     2     print('buy')
     3     name
     4 
     5 def back():
     6     print('back')
     7     [][1]
     8 
     9 def show():
    10     print('show')
    11     1/0
    12 
    13 def main():
    14     l = [('购物',buy),('退货',back),('查看订单',show)]
    15     while True:
    16         for num,i in enumerate(l,1):
    17             print(num,i[0])
    18         try:
    19             num = int(input('num >>>'))
    20             print(l[num - 1])
    21             func = l[num - 1][1]
    22             func()
    23         except (ValueError,IndexError) :
    24             print('您输入的内容不合法')
    25         except Exception as e:
    26             print(e)
    27             #print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)
    28             print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0])
    29 main()
    多分支+万能异常

      

     

三,其他

 

  • else分支
     1 try:
     2     print('aaa')  # 给某某某发邮件
     3     # name
     4     # [][1]
     5     # 1/0
     6 except NameError:   # 网络不稳定,邮箱地址错误
     7     print('name error')
     8 except IndexError:
     9     print('index error')
    10 except Exception as e:
    11     print('Exception')
    12 else:  # 当try中的代码不发生异常的时候 走else分支  如果发送成功了 进行一些处理
    13     print('else')
    else
  • finally分支,用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
     1 try:
     2     print('aaa')  # 给某某某发邮件
     3     name
     4     # [][1]
     5     # 1/0
     6 except NameError:   # 网络不稳定,邮箱地址错误
     7     print('name error')
     8 except IndexError:
     9     print('index error')
    10 except Exception as e:
    11     print('Exception')
    12 else:  # 当try中的代码不发生异常的时候 走else分支  如果发送成功了 进行一些处理
    13     print('else')
    14 finally: # 无论如何都会被执行
    15     print('finally')
    16 
    17 def func():
    18     f = open('file')
    19     try:
    20         while True:
    21             for line in f:
    22                 if line.startswith('a'):
    23                     return line
    24     except:
    25         print('异常处理')
    26     finally:   # 即使return也会先执行fianlly中的代码
    27         f.close()
    28 
    29 try:
    30     f = open('www','w')
    31     f.read()
    32 finally:   # 即使遇到报错,程序结束,也会先执行finally中的代码,然后再结束程序
    33     f.close()
    34     print('文件已经关闭了')
    35 
    36 finally用来回收一些操作系统的资源 : 数据库连接 打开的文件句柄 网络连接
    finally
  • 主动抛出异常 : 是给其他开发者用的
    1 raise ValueError
    2 raise ValueError('你写的不对')
    3 django是别人写的程序 框架 --> 程序员用
    View Code
  • 断言 - 语法,与if很像。
    断言

四,总结

try常与excel、finally连用。

try ... except
try ... except ... else
try ... finally
try ... except ... finally
try ... except ... else ... finally