zoukankan      html  css  js  c++  java
  • python错误和异常


    一:语法错误syntax errors
        
        熟悉语法!

    二:异常

        ①打印错误信息时,异常的类型作为异常的内置名显示,并以调用栈的形式显示具体信息
        ②常见的异常:
                NameError、
                ZeroDivisionError、
                TypeError
                SyntaxError
                IndexError    索引超出序列范围
                KeyError    请求一个不存在的字典关键字
                IOError        输入输出错误
                AttributeError    尝试访问未知的对象属性
    三:异常处理

        while True:
            try:
                x = int(input("Please enter a number: "))
                break
            except ValueError:
                print("Oops!  That was no valid number.  Try again   ")

        try语句按照如下方式工作;
        ①首先,执行try子句(在关键字try和关键字except之间的语句)
            ②如果没有异常发生,忽略except子句,try子句执行后结束。
            ③如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。
        ④如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。
        最后执行 try 语句之后的代码。
            ⑤如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。


        ⑥一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。
        最多只有一个分支会被执行。
        ⑦一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。

        except (RuntimeError, TypeError, NameError):
                pass

        ⑧最后一个except子句可以忽略异常的名称,它将被当作通配符使用。
        你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

        ⑨try except 语句还有一个可选的else子句,如果使用这个子句,
        那么必须放在所有的except子句之后。
        这个子句将在try子句没有发生任何异常的时候执行.

    三:抛出异常
        
        Python 使用 raise 语句抛出一个指定的异常
        raise 唯一的一个参数指定了要被抛出的异常。
        它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)

    四:用户自定义异常

        可以通过创建一个新的异常类来拥有自己的异常。
        异常类继承自 Exception 类,可以直接继承,或者间接继承。
        当创建一个模块有可能抛出多种不同的异常时,
        一种通常的做法是为这个包建立一个基础异常类,

    五:定义清理行为

        try:
            raise KeyboardInterrupt
        finanlly:
            print("dooo")
        不管 try 子句里面有没有发生异常,finally 子句都会执行
        如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,
        而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出

    六:扩展------------->断言机制
        assert 等价于布尔真的判定,不满足抛出异常AssertionError
        用途:    防御性的程序
            运行时需要逻辑检查
        参考文献:《python使用断言的最佳时机》

      1 # ---------------------------------------------------------------------#
      2 # 异常处理
      3 # ---------------------------------------------------------------------#
      4 
      5 while True:
      6     try:
      7         x = int(input("Please enter a number: "))
      8         break
      9     except ValueError:
     10             print("Oops!  That was no valid number.  Try again   ")
     11 
     12 # ---------------------------------------------------------------------#
     13 # 抛出异常
     14 # ---------------------------------------------------------------------#
     15 """
     16 try:
     17     raise NameError('HiThere')
     18 except NameError:
     19     print('An exception flew by!')
     20     raise
     21 """
     22 
     23 # ---------------------------------------------------------------------#
     24 # 用户自定义异常
     25 # ---------------------------------------------------------------------#
     26 
     27 
     28 class MyError(Exception):   # 继承自Exception
     29     def __init__(self, value):  # 构造函数重写
     30         self.value = value
     31 
     32     def __str__(self):
     33         return repr(self.value)
     34 
     35 
     36 try:
     37     raise MyError(2*2)  # 抛出异常
     38 except MyError as e:
     39         print('My exception occurred, value:', e.value)
     40 
     41 # 当创建一个模块有可能抛出多种不同的异常时,
     42 # 一种通常的做法是为这个包建立一个基础异常类,
     43 # 然后基于这个基础类为不同的错误情况创建不同的子类
     44 
     45 
     46 class Error(Exception):
     47     """Base class for exceptions in this module."""
     48     pass
     49 
     50 
     51 class InputError(Error):
     52     """Exception raised for errors in the input.
     53 
     54     Attributes:
     55         expression -- input expression in which the error occurred
     56         message -- explanation of the error
     57     """
     58 
     59     def __init__(self, expression, message):
     60         self.expression = expression
     61         self.message = message
     62 
     63 
     64 class TransitionError(Error):
     65     """Raised when an operation attempts a state transition that's not
     66     allowed.
     67 
     68     Attributes:
     69         previous -- state at beginning of transition
     70         next -- attempted new state
     71         message -- explanation of why the specific transition is not allowed
     72     """
     73 
     74     def __init__(self, previous, next1, message):
     75         self.previous = previous
     76         self.next = next1
     77         self.message = message
     78 
     79 
     80 try:
     81     raise InputError(2*2, 45)   # 抛出异常
     82 except InputError:         # 处理异常
     83         print('My exception occurred')
     84 
     85 # ---------------------------------------------------------------------#
     86 # 定义清理行为
     87 # ---------------------------------------------------------------------#
     88 
     89 
     90 def divide(x, y):
     91     try:
     92         result = x / y
     93     except ZeroDivisionError:
     94         print("division by zero!")
     95     else:                           # 没有异常的时执行
     96         print("result is", result)
     97     finally:                        # 无论在任何情况下都会执行的清理行为
     98         print("executing finally clause")
     99 
    100 
    101 # 一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,
    102 # 而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出
    103 # divide("2", "1")   #从测试代码




  • 相关阅读:
    记录一下周末作业
    超链接的 使用和按钮添加
    学习了网页设置上传视频
    Java-JDK安装及环境变量配置
    java-库存管理案例
    java-DateFormat
    java-正则表达式练习
    java-StringBuffer类
    java面对对象-匿名对象
    java static和final关键字
  • 原文地址:https://www.cnblogs.com/faithyiyo/p/9722738.html
Copyright © 2011-2022 走看看