python异常处理

异常处理

一、简介

1. 异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况.

2. 异常是程序执行过程中,发生了某种‘错误’,影响程序的正常运行. Python程序在执行前有可能会发生语法错误,也会导致程序无法正常执行。
    - 运行时错误
    - 语法错误

3. 异常处理的目的:通过异常处理,我们可以对程序中出现的意外情况进行处理,防止程序崩溃,增加程序的健壮性
在编程语言处理异常:
	1. 使用if判断进行处理
		   a = 5
            b = 0
            if b != 0:
                print(a / b)
            else:
                print('除数不能为0')
                
	2. 使用try块处理
	   	    a = 5
            b = 0
            try:
                print(a/b)
            except:
                print('除数不能为0')
# if更适合用于一些可以预判的一种异常情况,但是if不可能把所有的异常情况都判断到,有些异常是我们无法预知                

二、常见的异常

异常分类:(1)语法错误 (2)运行时错误
1. NameError: 名字异常
    变量未定义,直接去使用 NameError: name 'a' is not defined
    
2. IndentationError: 缩进错误
    在同一个代码块中,使用了不同的缩进  

3. SyntaxError:语法错误 
    1a = 5 变量名不能以数字开头
    
4. TypeError: 类型错误 
    print(1+'1')  字符串和Int类型不能直接相加
    
5. ZeroDivisionError:除数为零错误
    10/0 ZeroDivisionError: division by zero
    
6. FileNotFoundError: 文件未找到错误
    读文件时,文件不存在
    
7. StopIteration:迭代器异常
    next()调用次数超过了元素的个数

8. KeyError:键错误
    访问字典不存在的键 d[key]

9. ValueError: 值错误
    print(int('abc'))  将字符串强制转为int
    
10. AttributeError:属性错误
    访问对象中不存在的属性或方法时
    
11. indexError:下标(越界)异常    
	下标超出范围

12. RecursionError:递归异常
     递归超过最大深度
     
以上的异常类型都是由类定义的    

13. Exception: 常见的错误异常的基类(父类)

14. BaseException:所有异常的基类

三、处理异常

一般情况下,Python无法正确处理/执行程序时,就会发生(抛出)一个异常.

异常是一个对象,表示一个错误.

当Python程序发生异常时,我们就需要捕获并处理它,否则程序会终止执行(崩溃).

1. try-except
	try:
		可能出现异常的代码
	except:
    	所有的异常都会在这里处理(全捕获)
    	
     try:
     	可能出现异常的代码
     except 异常类型 as 变量名:
         只有匹配异常类型时,才会执行except (精准匹配)
         
# 注意:如果发生了异常,异常后面的代码不会被执行   
try:
    10/0
    print('go on')  # 这行代码不会被执行
except:
	xxx

示例:

# 全匹配
try:
    10/0
    # print([][1])
except :
    print('发生了错误')


# 精准匹配
try:
    10/0
    # print([][1])
except IndexError as e:
    print('发生了错误')
2. try-except-except
	try:
		可能出现异常的代码
	except 异常类型1 as e:
    	 该类型的异常处理
    except 异常类型2 as e:
    	 另一种类型的异常处理
    except:
    	xxx
# 注意:通用性最高的要放最后面,匹配性最高的要放最前面 

try:
    10/0
    # print([][1])
    # print(int('abc'))
except Exception as e:    #  这里的except往后放 通用性强
    print('发生下标越界错误',e)
except ZeroDivisionError as e:
    print('发生了除数为零的错误',e)
except:
    print('未知类型的异常')
# 多个except后面接异常类型
try:
    # 10/0
    print([][1])
except IndexError as e:
    print('发生下标越界错误',e)
except ZeroDivisionError as e:
    print('发生了除数为零的错误',e)

# 在最后,加except不加异常类型:用于匹配其它情况(相当于if..elif..elif..else中的else)
try:
    # 10/0
    # print([][1])
    print(int('abc'))
except IndexError as e:
    print('发生下标越界错误',e)
except ZeroDivisionError as e:
    print('发生了除数为零的错误',e)
except:
    print('未知类型的异常')    
3. try-except-except-else
	try:
		可能出现异常的代码
	except Exception as e:
    	print(e)
    else:
    	print('如果没有发生异常则执行else')

示例:

import traceback

try:
    # 可能出现异常的代码
    a = int(input('输入a:'))
    b = int(input('输入b:'))
    print(a / b)
except:
    print('出错了')
    traceback.print_exc()
else:
    print('这是else')
4. try-except-except-finally
      	- 不论代码是否出现异常,都会执行finally
  
import traceback

try:
    a = int(input('输入a:'))
    b = int(input('输入b:'))
    print(a / b)
except:
    traceback.print_exc()
finally:
    print('最终~~~~')   

四、自定义异常

class MyException(BaseException):
    def __init__(self, msg):
        self.__msg = msg

    def __str__(self):
        return self.__msg


try:
    a = int(input('输入a:'))
    b = int(input('输入b:'))
    if b == 1:
        # 什么时候抛出异常,以及什么是异常由程序员来决定
        raise MyException('除数不允许为1')
    else:
        print(a / b)
except MyException as e:
    print(e)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值