异常处理

Posted baohanblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。

一、什么是异常处理

异常是错误发生的信号,一旦程序出错就会产生一个异常,
如果该异常没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止。

异常包含三个部分:

  1. traceback异常的追踪信息
  2. 异常的类型
  3. 异常的信息
    技术图片
    错误分为两大类:
    1.语法上的错误:在程序运行前就应该立即修正
    2.逻辑上的错误

二、为何要异常处理

避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性

三、如何异常处理

try:  #try监听下面的代码块
    代码1
    代码2
    代码3
    ......
except NameError:
    当抛出的异常时 NameError时执行的子代码块
# 异常处理:
try:
    print('====>1')
    print('====>2')
    print('====>3')
    l = [1,2,3]
    l[100] #IndexError  #运行到此处直接跳到except下的代码块
    print('====>4')  #不执行
except IndexError:
    print('IndexError')
#异常处理多分支
try:
    print('====>1')
    print('====>2')
    print('====>3')
    l = [1,2,3]
    d = {'x':1,'y':2}
    d['z'] #KeyError
    l[100] #IndexError  #运行到此处直接跳到except下的代码块
    print('====>4')  #不执行
except IndexError:
    print('IndexError')
except KeyError:
    print('KeyError')

print('other code')
try:
    print('====>1')
    print('====>2')
    print('====>3')
    l = [1,2,3]
    d = {'x':1,'y':2}
    # d['z'] #KeyError
    # l[100] #IndexError
    print('====>4')  #不执行
except (KeyError,IndexError) as e:  #(KeyError,IndexError)捕捉其中一种异常
    print(e)

万能异常类型 Exception :可以捕捉任意类型的异常

try:
    print('====>1')
    print('====>2')
    print('====>3')
    l = [1,2,3]
    d = {'x':1,'y':2}
    d['z'] #KeyError
    l[100] #IndexError
    print('====>4')  #不执行
except Exception as e:  # as 给异常起别名
    print(e)
print('other code')

try + else...: else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行

try:
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    # d['z']  # KeyError
    # xxx
    print('=====4')
    l = [1, 2, 3]
    # l[1000]  # IndexError
    print('=====5')
except IndexError as e:
    print('IndexError:', e)
except KeyError as e:
    print('KeyError:', e)
except Exception as e:
    print('Exception:',e)
else:
    print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行')
print('other code')

try + finally... :无论finally前面被检测的代码有没有异常都会执行

try:
    f=open('a.txt','w')
    print('=====1')
    print('=====2')
    print('=====3')
    d = {'x': 1, 'y': 2}
    # d['z']  # KeyError
    # xxx
    'xx' > 10
    print('=====4')
    l = [1, 2, 3]
    # l[1000]  # IndexError
    print('=====5')

except IndexError as e:
    print('IndexError:', e)
except KeyError as e:
    print('KeyError:', e)
# except Exception as e:
#     print('Exception:',e)
else:
    print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行')
finally:
    print('无论被检测的代码有没有异常都会执行')
    f.close()
# 主动触发异常
print('===>1')
print('===>2')
raise TypeError('类型错误')
print('===>3')

class People:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def tell_info(self):
        print(self.__name,self.__age)

    def set_info(self,name,age):
        if not isinstance(name,str):
            raise TypeError('名字必须是str类型')
        if not isinstance(age,int):
            raise TypeError('年龄必须是int类型')
        self.__name=name
        self.__age=age

obj=People('egon',18)
# print(obj.__dict__)
# obj.tell_info()

obj.set_info('egon',123)
obj.tell_info()
#自定义异常类型
class MyException(BaseException):
    def __init__(self,msg):
        super().__init__()
        self.msg=msg

    def __str__(self):
        return '<%s>' %self.msg

raise MyException('我自定义的异常')

以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章

使用片段中的处理程序时出现非法状态异常

Java异常处理机制

java 反射代码片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

片段中的Android致命异常