• Python基础教程——8 异常


    第8章 异常

    8.1 什么是异常

    >>> 1/0

    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        1/0
    ZeroDivisionError: integer division or modulo by zero

    8.2按自己的方式出错

    8.2.1 raise语句
    >>> raise Exception

    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        raise Exception
    Exception


    >>> raise Exception('hyperdrive overload')

    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        raise Exception('hyperdrive overload')
    Exception: hyperdrive overload


    >>> import exceptions
    >>> dir(exceptions)
    ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__doc__', '__name__']

    >>> raise ArithmeticError

    Traceback (most recent call last):
      File "<pyshell#7>", line 1, in <module>
        raise ArithmeticError
    ArithmeticError
    >>>

    8.3 捕捉异常

    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except ZeroDivisionError:
     print 'The second number should not be zero! '

    Input the x: 10
    Input the y: 0
    The second number should not be zero!


    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except ZeroDivisionError:
     print 'The second number should not be zero! '

    Input the x: 8
    Input the y: 9
    0

    屏蔽除零错误

    >>> class MuffledCalculator:
     muffled = False
     def calc(self,expr):
      try:
       return eval(expr)
      except ZeroDivisionError:
       if self.muffled:
        print 'Division by zero is illegal'
       else:
        raise

    >>> calculator = MuffledCalculator()
    >>> calculator.calc('10/2')
    5
    >>> calculator.calc('10/0')

    Traceback (most recent call last):
      File "<pyshell#40>", line 1, in <module>
        calculator.calc('10/0')
      File "<pyshell#37>", line 5, in calc
        return eval(expr)
      File "<string>", line 1, in <module>
    ZeroDivisionError: integer division or modulo by zero
    >>> calculator.muffled = True
    >>> calculator.calc('10/0')
    Division by zero is illegal

    如果捕捉到异常,但是又想重新引发它,也就是说要传递异常,那么可以调用不带参数的raise们还能在捕捉到异常时显式的提供具体异常

    如果这个行为被激活,那么计算器就会打印错误信息,而不是让异常传播,如果在于用户交互的过程中,那么这就很有用了。

    但是如果在程序内部使用,引发异常会更好些,因此屏蔽机制就可以关掉了。

    8.4 不止一个except子句

    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except ZeroDivisionError:
     print 'The second number should not be zero! '
    except TypeError:
     print 'That was not a number?!'

    Input the x: 10
    Input the y: 'Hi'
    That was not a number?!

    8.5 用一个块捕捉两个异常

    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except (ZeroDivisionError, TypeError, NameError):
     print 'Your numbers were bogus....'

    Input the x: 8
    Input the y: 0
    Your numbers were bogus....


    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except (ZeroDivisionError, TypeError, NameError):
     print 'Your numbers were bogus....'

    Input the x: 10
    Input the y: 'Hi'
    Your numbers were bogus....

    8.6捕捉对象

    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except (ZeroDivisionError, TypeError),e:
     print e

    Input the x: 10
    Input the y: 0
    integer division or modulo by zero
    >>> e
    ZeroDivisionError('integer division or modulo by zero',)
    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except (ZeroDivisionError, TypeError),e:
     print e

    Input the x: 'Hello'
    Input the y: 'world'
    unsupported operand type(s) for /: 'str' and 'str'
    >>> e
    TypeError("unsupported operand type(s) for /: 'str' and 'str'",)

    8.7真正的全捕捉

    >>> try:
     x = input('Input the x: ')
     y = input('Input the y: ')
     print x/y
    except :
     print 'Something was wrong...'

    Input the x: 8
    Input the y: 'haha'
    Something was wrong...

    8.8 完事大吉

    >>> try:
     print 'A simple task.'
    except:
     print 'What? Something was wrong?'
    else:
     print 'Ah...It was as planned'

    A simple task.
    Ah...It was as planned

    一直输入直到合法输入

    >>> while True:
     try:
      x = input('Input the x: ')
             y = input('Input the y: ')
             value = x/y
             print 'x/y is',value
     except:
      print 'Invalid input.Please try again'
     else:
      break

    Input the x: 8
    Input the y: 0
    Invalid input.Please try again
    Input the x: 8
    Input the y: '1'
    Invalid input.Please try again
    Input the x: 8
    Input the y:
    Invalid input.Please try again
    Input the x: 9
    Input the y: 2
    x/y is 4

    打印错误信息

    >>> while True:
     try:
      x = input('Input the x: ')
             y = input('Input the y: ')
             value = x/y
             print 'x/y is',value
     except Exception , e:
      print 'Invlid input',e
      print 'Invalid input.Please try again'
     else:
      break

    Input the x: 1
    Input the y: 0
    Invlid input integer division or modulo by zero
    Invalid input.Please try again
    Input the x: 4
    Input the y: '2'
    Invlid input unsupported operand type(s) for /: 'int' and 'str'
    Invalid input.Please try again
    Input the x: 3
    Input the y:
    Invlid input unexpected EOF while parsing (<string>, line 0)
    Invalid input.Please try again
    Input the x: 4
    Input the y: 2
    x/y is 2

     8.9 最后

    >>> x = None
    >>> try:
     x = 1/0
    finally:
     print 'Cleaning up...'
     del x

    Cleaning up...

    Traceback (most recent call last):
      File "<pyshell#6>", line 2, in <module>
        x = 1/0
    ZeroDivisionError: integer division or modulo by zero
    >>>

    >>> try:
     1/0
    except NameError:
     print 'Unkown variable'
    else:
     print 'It is ok.'
    finally:
     print 'Cleaning up..'

    Cleaning up..

    Traceback (most recent call last):
      File "<pyshell#17>", line 2, in <module>
        1/0
    ZeroDivisionError: integer division or modulo by zero
    >>>

    8.10 异常和函数

     def faulty():
        raise Exception('Something is wrong.')
    def ignore_exception():
        faulty()
    def handle_excepton():
        try:
            faulty()
        except:
            print 'Exception handled'
    print 'ignore_exception()'
    ignore_exception()

    ignore_exception()

    Traceback (most recent call last):
      File "F:/Python/8-1函数与异常.py", line 11, in <module>
        ignore_exception()
      File "F:/Python/8-1函数与异常.py", line 4, in ignore_exception
        faulty()
      File "F:/Python/8-1函数与异常.py", line 2, in faulty
        raise Exception('Something is wrong.')
    Exception: Something is wrong.

    >>> handle_exception()
    Exception handled
    >>>

    8.11

    >>> def describlePerson(person):
     print 'Description of ',person['name']
     print 'Age: ',person['age']
     try:
      print 'Occupation: '+person['occupation']
     except KeyError:
      pass

    >>> person = {'name':'ABC','age':21}
    >>> person
    {'age': 21, 'name': 'ABC'}
    >>> describlePerson(person)
    Description of  ABC
    Age:  21

  • 相关阅读:
    实用机器人设计(六)-建图,导航和路径规划
    实用机器人设计(五)-机器人电机功率选择和减速箱传动比设计
    实用机器人设计(四)-电机和驱动系统基础原理
    实用机器人设计(三)-计算机视觉
    Git 提交文件到Github
    爬虫框架Scrapy
    scrapy终端与核心组件
    图像识别与文字处理
    存储爬虫数据--Mongodb
    并发下载
  • 原文地址:https://www.cnblogs.com/miki/p/3308565.html
Copyright © 2020-2023  润新知