zoukankan      html  css  js  c++  java
  • 异常、调试

    异常和调试
    异常的概念

    异常:
      一般情况下,在Python无法正常处理程序时就会发生一个异常
      异常是Python对象,表示一个错误
      当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
      可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句
      Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽
      因此,错误并不是凭空产生的,而是有意创建并抛出的
      创建一个错误类型抛出来
      能处理就处理,不知道怎么处理就往上抛
      raise语句如果不带参数,就会把当前错误原样抛出。此外,在except中raise一个Error,还可以把一种类型的错误转化成另一种类型:
      父类异常会把子类异常一网打尽

      try:
      <语句> #运行别的代码
      except <名字>:
      <语句> #如果在try部份引发了'name'异常
      except <名字>,<数据>:
      <语句> #如果引发了'name'异常,获得附加的数据
      else:
      <语句> #如果没有异常发生

      使用except而不带任何异常类型

      你可以不带任何异常类型使用except,如下实例:

      try:
      正常的操作
      ......................
      except:
      发生异常,执行这块代码
      ......................
      else:
      如果没有异常执行这块代码
      以上方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。

      使用except而带多种异常类型
      你也可以使用相同的except语句来处理多个异常信息,如下所示:
      try:
      正常的操作
      ......................
      except(Exception1[, Exception2[,...ExceptionN]]]):
      发生以上多个异常中的一个,执行这块代码
      ......................
      else:
      如果没有异常执行这块代码

      try-finally 语句
      try-finally 语句无论是否发生异常都将执行最后的代码。
      try:
      <语句>
      finally:
      <语句> #退出try时总会执行
      raise

      try:
      fh = open("testfile", "w")
      try:
      fh.write("这是一个测试文件,用于测试异常!!")
      finally:
      print "关闭文件"
      fh.close()
      except IOError:
      print "Error: 没有找到文件或读取文件失败"
      当在try块中抛出一个异常,立即执行finally块代码。
      finally块中的所有语句执行后,异常被再次触发,并执行except块代码。

     异常的参数
      # 定义函数
      def temp_convert(var):
      try:
        return int(var)
        except ValueError, Argument:
      print "参数没有包含数字 ", Argument

      # 调用函数
      temp_convert("xyz");
      调试:
        是跟踪程序的执行过程,就是查看变量的值
        排查原因思路:在哪报错了,为什么报错
      print assert n != 0, 'n is zero!' assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。
      程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:
      关闭后,你可以把所有的assert语句当成pass来看。

    方法3:logging
      这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息
      import logging
      logging.basicConfig(level=logging.INFO)
      s = '0'
      n = int(s)
      logging.info('n = %d' % n)
      print 10 / n

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/xuanjian-91/p/8288999.html
Copyright © 2011-2022 走看看