异常处理

一,可避免语法异常

  • 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

 四,自定义异常

  下面是自定义异常的是三种方法,非常推荐。

 1 class MyException(Exception):
 2     def __init__(self,code,msg):
 3         self.code = code
 4         self.msg = msg
 5 try:
 6     raise MyException(1000,'操作异常')
 7 
 8 except KeyError as obj:
 9     print(obj,1111)
10 except MyException as obj:
11     print(obj,2222)
12 except Exception as obj:
13     print(obj,3333)
 1 def func(path,prev):
 2     """
 3     去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。
 4         1000,成功
 5         1001,文件不存在
 6         1002,关键字为空
 7         1003,未知错误
 8         ...
 9     :return:
10     """
11     response = {'code':1000,'data':None}
12     try:
13         if not os.path.exists(path):
14             response['code'] = 1001
15             response['data'] = '文件不存在'
16             return response
17         if not prev:
18             response['code'] = 1002
19             response['data'] = '关键字为空'
20             return response
21         pass
22     except Exception as e:
23         response['code'] = 1003
24         response['data'] = '未知错误'
25     return response
26 
27 def show():
28     return 8
29 
30 
31 def run():
32     pass
 1 # by luffycity.com
 2 import os
 3 
 4 
 5 class ExistsError(Exception):
 6     pass
 7 
 8 class KeyInvalidError(Exception):
 9     pass
10 
11 def new_func(path,prev):
12     """
13     去path路径的文件中,找到前缀为prev的一行数据,获取数据并返回给调用者。
14         1000,成功
15         1001,文件不存在
16         1002,关键字为空
17         1003,未知错误
18         ...
19     :return:
20     """
21     response = {'code':1000,'data':None}
22     try:
23         if not os.path.exists(path):
24             raise ExistsError()
25 
26         if not prev:
27             raise KeyInvalidError()
28         pass
29     except ExistsError as e:
30         response['code'] = 1001
31         response['data'] = '文件不存在'
32     except KeyInvalidError as e:
33         response['code'] = 1002
34         response['data'] = '关键字为空'
35     except Exception as e:
36         response['code'] = 1003
37         response['data'] = '未知错误'
38     return response

 

posted on 2023-12-04 22:01  我才是最帅的那个男人  阅读(23)  评论(0)    收藏  举报

导航