Python_异常处理结构与调试
1 while True: 2 x =input('Pleaes input:') 3 try: 4 x=int(x) 5 print('You have input {0}'.format(x)) 6 break 7 except Exception as e: 8 print('Error.') 9 10 try: 11 raise Exception('spam','eggs') 12 except Exception as inst: 13 print(type(inst)) #the exceptiton instance 14 print(inst.args) #arguments stored in .args 15 print(inst) #__str__ allows args to be printed dierctly.#but may be overidden in exception subclasses 16 x,y = inst.args #unpack args 17 print('x=',x) 18 print('y=',y) 19 20 21 ''' 22 如果try范围内捕获了异常,就执行except块;如果try范围内没有捕获异常,就执行else块。 23 ''' 24 a_list=['China','America','England','Francce'] 25 while True: 26 n=input('请输入字符串的序号') 27 try: 28 n=int(n) 29 print(a_list[n]) 30 except IndexError: 31 print('列表元素的下标越,请重新输入字符串的序号') 32 else: 33 break 34 35 #查看多个文本文件分别有多少行 36 import sys 37 for arg in sys.argv[1:]: 38 try: 39 f=open(arg,'r') 40 except IOError: 41 print(arg,'has',len(f.readlines()),'lines') 42 f.close() 43 44 #要求用户输入整数 45 while True: 46 x = input('Please input:') 47 try: 48 x=int(x) 49 except Exception as e: 50 print('Error.') 51 else: 52 print('You have input{0}'.format(x)) 53 break 54 55 '''带多个except的try结构 56 try: 57 try块 #被监控的语句 58 except Exception1: 59 except块1 #处理异常1的语句 60 except Exception2: 61 :except块2 #处理异常2的语句 62 '''#例如 63 try: 64 x=input('请输入整数:') 65 y=input('请输入除数:') 66 z=float(x) / float(y) 67 except ZeroDivisionError: 68 print('除数不能为零') 69 except TypeError: 70 print('被除数和除数应为数值类型') 71 except NameError: 72 print('变量不存在') 73 else: 74 print(x,'/',y,'=',z) 75 76 import sys 77 try: 78 f = open('test.txt') 79 s = f.readline() 80 i = int(s.strip()) 81 f.close() 82 except OSError as err: 83 print('OS error:{0}'.format(err)) 84 except ValueError: 85 print('Could not convert data to an integer.') 86 except: 87 print('Could not convert data to an integer.') 88 raise 89 90 #将要捕获的异常写在一个元组中,可以使用一个except语句捕获多个异常 91 import sys 92 try: 93 f = open('test.txt') 94 s = f.readline() 95 i = int(s.strip()) 96 f.close() 97 except (OSError,ValueError,RuntimeError,NameError): 98 pass 99 100 ''' 101 try...except...finally结构 102 在该结构中,finally子句中的内存无论是否发生异常都会执行,常用来做一些清理工作以释放ttry子句中申请的资源 103 ''' 104 try: 105 3/0 106 except: 107 print(3) 108 finally: 109 print(5) 110 111 #使用异常处理结构保证文件呢总能关闭 112 '''如果try子句中的异常没有被处理,或者在except子句或else子句中出现了异常,那么这些异常 113 将会在finally子句执行完成后再次抛除,例如 114 try: 115 3/0 116 finally: 117 print(5) 118 ''' 119 try: 120 f = open('test.txt','r') 121 line = f.readline() 122 print(line) 123 finally: 124 f.close() 125 126 '''使用带finally子句的异常处理结构时,应尽量避免在finally子句中使用return语句,否则 127 可能出现出乎意料的错误''' 128 def demo_div(a,b): 129 try: 130 return a/b 131 except: 132 pass 133 finally: 134 return -1 135 demo_div(1,0) 136 # -1 137 demo_div(1,2) 138 # -1 139 140 '''try...except...except...else...finally结构''' 141 def div(x,y): 142 try: 143 print(x/y) 144 except ZeroDivisionError: 145 print('ZeroDivisionError') 146 except TypeError: 147 print('TypeError') 148 else: 149 print('No Error') 150 finally: 151 print('executing finally clause') 152 153 '''断言与上下文管理是两种比较特殊的异常处理方式,在形式上比异常处理结构要简单一些。 154 断言语句的语法是: 155 assert expression[,reason] 156 1.当判断表达式expression为真时,什么都不做,如果表达式为假,则抛出异常 157 2.assert语句一般用于开发程序时对特定必须满足的条件进行验证,仅当__debug__为True时有效. 158 当Python脚本以-O选项编译为字节码文件时,assert语句将被移除以提高运行速度。 159 ''' 160 a = 3 161 b = 5 162 assert a==b,'a must be equal to b' 163 164 '''上下文管理语句 165 1.使用with自动关闭资源,可以在代码块执行完毕后还原进入该代码块时的现场 166 2.不论何种原因跳出with块,不论是否发生异常,总能保证文件被正确关闭,资源被正确释放 167 ''' 168 with open('sample.txt') as f: 169 for line in f: 170 print(line,end='') 171 ''' 172 当发生异常时,Python会回溯异常,给出大量的提示,可能会给程序员定位和纠错带来一定的困难, 173 这时可以使用sys模块来回溯最近一次异常 174 example: 175 ''' 176 import sys 177 try: 178 block 179 except: 180 tuple = sys.exc_info() 181 #sys.exc_info()的返回值是一个三元组(type,message,trackback) 182 #type:异常的类型 value/message:异常的信息或者参数 traceback:包含调用栈信息的对象 183 #可以直接定位最终引发异常的原因,结果也比较简洁,但是缺点是难以直接确定引发异常的代码位置。 184 print(tuple) 185 186 import pdb 187 ''' 188 1.pdb是Python自带的交互式源代码调试模块,代码文件为pdb.py,但需要导入后才能使用其中的功能, 189 使用该模块可以完成代码调试的绝大部分功能,包括设置/清除(条件)断点、启用/禁用断点、单步执行 190 查看栈帧、查看变量值、查看当前执行位置、列出源代码、执行任意Python代码或表达式等等 191 2.pdb还支持事后调试,可在程序控制下被调用。 192 3.可以通过pdb和cmd接口对该调试器进行扩展。 193 ''' 194 195 196 #pdb模块用法主要有三种: 197 #1.在交互模式下调试语句快、表达式、函数等多种脚本。 198 # (1)pdb.run(statement[,globals[,locals]]):调试指定语句,可选参数globals和locals用来指定代码执行的坏境,默认是__main__模块的字典 199 # (2)pdb.runeval(expression[,globals[,locals]):返回表达式的值,其他与run函数一样. 200 # (3)pdb.runcall(function[,argument,...]):调试指定函数 201 # (4)pdb.post_mortem([traceback]):进入指定trackback对象的时候调试模式,如果没有指定traceback对象,则使用当前正在处理的一个异常 202 import pdb 203 def f(): 204 x = 5 205 print(x) 206 pdb.runcall(f) 207 208 #2.在程序中嵌入调试功能 209 #(1)在程序中首先导入pdb模块,然后使用pdb.set_trace()在需要的位置设置断点。 210 #(2)在命令提示符环境下执行该程序或双击执行程序时自动打开pdb调试环境,即使该程序当前不处于调试状态。 211 import pdb 212 n = 37 213 pdb.set_trace() #插入断点 214 for i in range(2,n): 215 if n%i == 0: 216 print('No') 217 break 218 else: 219 print('Yes') 220 221 #3.使用命令行调试程序 222 #在命令行提示符下执行'pythhon -m pdb脚本文件名',则直接进入调试环境: 223 #当调试结束或程序正常结束以后,pdb将重新启动程序: