异常

错误


  • 例如

      >>> Print('fdsa');
      Traceback (most recent call last):
        File "", line 1, in 
      Print('fdsa');
      NameError: name 'Print' is not defined
    
    • NameError被抛出,同时Python还会打印出检测到的错误发生的位置。着就是一个错误处理器(Error Handler)为这个错误所做的事情

异常


  • 输入以下代码,按ctrl+d

      >>> s=input("input ----->");
      input ----->
      Traceback (most recent call last):
        File "", line 1, in 
      s=input("input ----->");
      EOFError: EOF when reading a line
      >>> 
    

处理异常


  • 我们通过使用try...except来处理异常情况,一般来说我们会把通常的语句放在try代码块中,将我们的错误处理器代码放置在except代码块

  • 案例:

      try: 
          text = input("Enter something-->");
      except EOFError:
          print('Why did you do an EOFError on me');
      except KeyboardInterrupt:
          print('You cancelled the operation.');
      else:
          print('You Entered {}'.format(text));
    

抛出异常


  • 可以通过raise语句来引发一次异常,具体方法是:

    • 提供错误名或异常名
    • 抛出异常的对象
  • 你能够引发的错误或异常必须是直接或间接从属于Exception(异常)类的派生类

  • 案例:

      class ShortInputException(Exception):
          def __init__(self,length,atLeast):
              Exception.__init__(self);
              self.length=length;
              self.atLeast = atLeast;
      
      try:
          text = input("please Enter sth--->");
          if len(text) <3:
              raise ShortInputException(len(text),3);
      except EOFError:
          print('Why did you do an EOFError on me');
      except ShortInputException as ex:
          print('ShortInputException:The input was '+
          '{0}long,expected at least{1}'.format(ex.length,ex.atLeast));
      else:
          print('No exception was raised.');
    
    • warning:我们在except字句中,提及了错误类,将该类存储as(为)相应的错误名或异常名ex;

Try...Finally

  • 无论是否发生异常,都可以用finally

  • 案例:

      import sys;
      import time;
      f = None;
      try:
          f = open("poem.txt");
          
          while True:
              line = f.readline();
              if len(line)==0:
                  break;
              print(line,end='');
              sys.stdout.flush();
              print('Press ctrl+c now');
              #为了确保它能运行一段时间
              time.sleep(2);
      except IOError:
          print('Could not find file poem.txt');
      except KeyboardInterrupt:
          print('!! You cancelled the reading from the file.');
      finally:
          if f:
              f.close();
          print("(Cleaning up:Closed the file)");
    

with语句


  • 在try块中获取资源,然后再finally块中释放资源是一种常见的模式。因此还有一个with语句使得这一过程可以以一种干净的姿态得以完成

  • 案例:

      with open('poem.txt') as f:
          for line in f:
              print(line,end='');

你可能感兴趣的:(异常)