zoukankan      html  css  js  c++  java
  • 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将重新启动程序:
  • 相关阅读:
    Aspect Oriented Programming
    jsp01
    监听器
    Java编写验证码
    servlet07
    MySQL02
    MySQL01
    Java的jdk1.6与jre1.8中存在的差异
    登陆验证和二级联动
    ajax和json
  • 原文地址:https://www.cnblogs.com/cmnz/p/7049408.html
Copyright © 2011-2022 走看看