码迷,mamicode.com
首页 > 编程语言 > 详细

Python-异常处理

时间:2018-09-25 01:13:24      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:deadlock   sla   逻辑   unicode   poi   bsp   逻辑错误   class   proc   

、异常 Exception

  错误 和 异常的区别:

    错误:Error

      • 逻辑错误:算法错误,加法写成了减法
      • 笔误:变量名写错了,语法错误
      • 函数或类使用错误,其实这也属于逻辑错误
      • 总之错误是可以避免的

    异常:Exception

      • 本意就是意外情况
      • 这有个前提,没有出现上面说的错误,也就是说程序写的没问题,但是在某些情况下,会出现一些意外,导致程序无法正常的执行下去
      • 例如open函数,操作一个文件,文件不存在,或创建一个文件已经存在,或访问一个网络文件突然断网了,这就是一场,是个意外的情况。
      • 异常是不可能避免的

    错误和异常:

      在高级编程语言中一般都有错误和异常的概念,异常是可以捕获,并被处理的,但是错误是不能被捕获的。

    举例:

      异常:

技术分享图片

      错误:

技术分享图片

    总结:

      一个健壮的程序

      尽可能的避免错误

      尽可能的捕获,处理各种异常。

      Python的特点是,将Error放到异常类中。

2、产生异常:

  产生:

    • raise 语句显式的抛出异常(手动抛出)
    • Python解释器自己检测到异常并引发它

  举例:

    解释器自动抛出:

技术分享图片

    手动抛出:

技术分享图片

    程序会在异常抛出的地方中断执行,如果不捕获,就会提前结束程序(其实是终止当前线程的执行)

    raise:

    raise 后面什么都没有,表示抛出最近一个被激活的异常,如果没有被激活的异常,则抛类型异常,这种但是很少使用。

    raise 后要求应该是BaseException类的子类或实例,如果是类,将被无参实例化

       raise IndexError() :无参构造 ----BaseException的派生类
          raise IndexError :无参构造 ----BaseException的派生类
          raise IndexError(‘index error‘) :有参构造 ----BaseException的派生类

 

3、异常的捕获:

  语法:

1 try2     待捕获异常的代码块,只要出现一条异常,就会终止,后面的执行,跳到except
3 except [异常类型]:
4     异常的处理代码块

 

  举例:

    1:

技术分享图片

    2:

技术分享图片

    3:

技术分享图片

 

4、异常类及继承层次:

  获取BaseException的子类:

技术分享图片
 1 def foo(cls, count=0):
 2    for i in cls.__subclasses__():
 3        if count == 0:
 4            print(count * \t +   +--  + str(i))
 5        else:
 6             print((count - 1) * \t+ | + \t +  +--  + str(i))
 7        if  i.__subclasses__() :
 8            count += 1
 9            foo(i, count)
10        else:
11            continue
12 
13 
14 foo(BaseException)
View Code

  结果:

技术分享图片
 1 +-- <class Exception>
 2 |    +-- <class TypeError>
 3 |    +-- <class StopAsyncIteration>
 4 |    +-- <class StopIteration>
 5 |    +-- <class ImportError>
 6     |    +-- <class ModuleNotFoundError>
 7     |    +-- <class zipimport.ZipImportError>
 8     |    +-- <class OSError>
 9         |    +-- <class ConnectionError>
10             |    +-- <class BrokenPipeError>
11             |    +-- <class ConnectionAbortedError>
12             |    +-- <class ConnectionRefusedError>
13             |    +-- <class ConnectionResetError>
14             |    +-- <class BlockingIOError>
15             |    +-- <class ChildProcessError>
16             |    +-- <class FileExistsError>
17             |    +-- <class FileNotFoundError>
18             |    +-- <class IsADirectoryError>
19             |    +-- <class NotADirectoryError>
20             |    +-- <class InterruptedError>
21             |    +-- <class PermissionError>
22             |    +-- <class ProcessLookupError>
23             |    +-- <class TimeoutError>
24             |    +-- <class io.UnsupportedOperation>
25         |    +-- <class EOFError>
26         |    +-- <class RuntimeError>
27             |    +-- <class RecursionError>
28             |    +-- <class NotImplementedError>
29             |    +-- <class _frozen_importlib._DeadlockError>
30             |    +-- <class NameError>
31                 |    +-- <class UnboundLocalError>
32                 |    +-- <class AttributeError>
33                 |    +-- <class SyntaxError>
34                     |    +-- <class IndentationError>
35                         |    +-- <class TabError>
36                     |    +-- <class LookupError>
37                         |    +-- <class IndexError>
38                         |    +-- <class KeyError>
39                         |    +-- <class encodings.CodecRegistryError>
40                         |    +-- <class ValueError>
41                             |    +-- <class UnicodeError>
42                                 |    +-- <class UnicodeEncodeError>
43                                 |    +-- <class UnicodeDecodeError>
44                                 |    +-- <class UnicodeTranslateError>
45                                 |    +-- <class io.UnsupportedOperation>
46                             |    +-- <class AssertionError>
47                             |    +-- <class ArithmeticError>
48                                 |    +-- <class FloatingPointError>
49                                 |    +-- <class OverflowError>
50                                 |    +-- <class ZeroDivisionError>
51                                 |    +-- <class SystemError>
52                                     |    +-- <class encodings.CodecRegistryError>
53                                     |    +-- <class ReferenceError>
54                                     |    +-- <class MemoryError>
55                                     |    +-- <class BufferError>
56                                     |    +-- <class Warning>
57                                         |    +-- <class UserWarning>
58                                         |    +-- <class DeprecationWarning>
59                                         |    +-- <class PendingDeprecationWarning>
60                                         |    +-- <class SyntaxWarning>
61                                         |    +-- <class RuntimeWarning>
62                                         |    +-- <class FutureWarning>
63                                         |    +-- <class ImportWarning>
64                                         |    +-- <class UnicodeWarning>
65                                         |    +-- <class BytesWarning>
66                                         |    +-- <class ResourceWarning>
67                                         |    +-- <class locale.Error>
68                                         |    +-- <class warnings._OptionError>
69 +-- <class GeneratorExit>
70 +-- <class SystemExit>
71 +-- <class KeyboardInterrupt>
View Code

技术分享图片

技术分享图片

 

 

 



        捕获特定异常:
            try:
                只要出现一条异常,就会终止当前try 里边的都终止,后面的 不会执行
            except FileNotFoundError: 捕获特定的异常!!!!!!!!!!!
                这里的代码,用来处理异常。

        sys.exit(0) 不管是几 都会触发一个异常。即便是0,但是很少调用。

        自定义的异常,继承Exception

        语法错误是无法捕获的!!!!

        多个异常捕获,父类的异常往下写。如果对某种异常有特定的处理,就提取出来,方到上面

        多个except,进入一个except,如果处理了,其他的except就不进去了。

        finally 里边的肯定执行

        多个return,压栈,第一个弹出的,作为返回值。

        一般return不放在finlly中,会压制异常

        raise和return 不推荐同时使用, 矛盾。

        else:没有异常,就执行,类似for循环,没有break 或return 就执行

 

Python-异常处理

标签:deadlock   sla   逻辑   unicode   poi   bsp   逻辑错误   class   proc   

原文地址:https://www.cnblogs.com/JerryZao/p/9697172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!