• 异常、调试


    异常和调试
    异常的概念

    异常:
      一般情况下,在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

  • 相关阅读:
    一个漂亮的lazarus做的pagecontrol
    预测,阿里盒子必将失败!
    sex在软件开发中的运用--SIX技术
    糟糕的@@identity,SCOPE_IDENTITY ,IDENT_CURRENT
    Delphi、Lazarus保留字、关键字详解
    糟糕的界面设计
    Firebird存储过程--更加人性化的设计
    lazarus的动态方法和虚拟方法
    用户行为导向的交互设计
    Javascript的一个怪现象
  • 原文地址:https://www.cnblogs.com/xuanjian-91/p/8288999.html
Copyright © 2020-2023  润新知