异常

异常

多个except

  

def func():
    try:
        n1 = int(input('输入第一个数字:'))
        n2 = int(input('输入第二个数字:'))
        # + 加法
        per = input('输入运算符号(+ - * /):')

        result = 0
        if per == '+':
            result = n1 + n2
        elif per == '-':
            result = n1 - n2
        elif per == '*':
            result = n1 * n2
        elif per == '/':
            result = n1 / n2
        else:
            print('符号输入有误!')

        print('结果是:', sum)
    except ZeroDivisionError:
        print('除数不能为零!!!!')
    except ValueError:
        print('必须输入数字!!!!')
    except FileNotFoundError:
        pass
    except NameError:
        pass
    except Exception:
        pass

func()

print('------------>')

情况3:try...except..(多个except)...else
  try:
     有可能有异常的代码
  except 类型1:
      pass
      ..
  else:
     如果try中没有发生异常则进入的代码

注意: 如果使用else则在try代码中不能出现return

情况4:

# 文件操作  stream = open(...)   stream.read()   stream.close()
# 数据库操作  close()
try;
   pass
except:
   pass
finally:
   pass

'''

语法:
    try:
        【代码块A】 #可能会出错误的代码    异常检测
    except Exception1[ as e]:   #异常处理
     【代码块1】  #异常处理代码       
    except Exception2[ as e]:   #异常处理
         【代码块2】  #异常处理代码
    ....
    except Exceptionn[ as e]:   #异常处理
      【代码块n】  #异常处理代码
    [else:]                #可选,如果没有引发异常会执行
        处理语句       
    [finally:]             #无论如何都要执行的语句
        处理语句
   【后续语句】

- 执行流程:
  - 1、首先执行try中【代码块A】,如果出现异常,立即终止代码执行,转而到except块中进行异常处理
  - 2、异常处理except模块可以多个,从上往下匹配,如果能够匹配成功,立即执行相应的异常处理代码块,执行完毕后,不在往下匹配,转到3执行
  - 3、执行异常处理完毕后,如果有finally字句则执行finally字句,如果没有则执行【后续语句】
  - 4、如果匹配不到异常,有finally则执行finally,然后则抛出错误,终止程序执行。
  - 5、如果没有异常,如果有else字句则执行else字句,执行完else后,有finally字句则执行,没有则执行【后续语句】
- 注意事项:
  - except匹配顺序从上到下
  - except语句书写要求:精确的类型往前放,模糊的,不精确的往后放
  - except不带任何类型,则匹配所有类型异常,应该放到最后,吞掉异常
  - 可以将多种异常用元组的方式(异常类型1,异常类型2...异常类型n)书写,简化代码
  - except字句中e,是一个对象,打印它,会显示异常信息描述
  - try-except也可以捕获方法或函数中抛出的异常
  - 所有异常类型都继承自BaseException,使用BaseException可以将异常一网打尽
  - finally字句中可以进行一些清理工作,比如关闭文件,数据库等工作

 

抛出异常 raise

# 抛出异常 raise

# 注册 用户名必须6位
def register():
    username = input('输入用户名:')
    if len(username) < 6:
        raise Exception('用户长度必须6位以上')
    else:
        print('输入的用户名是:', username)


try:
    register()
except Exception as err:
    print(err)
    print('注册失败!')
else:
    print('注册成功!')
    # print(a)

 手动抛出一个指定类型的异常,无论是哪种异常类都可以带一个字符串参数,对异常进行描述。

- raise不带参数会把错误原样抛出


try:
    raise ZeroDivisionError('除0错误')
    # raise ZeroDivisionError  #如果不想获取错误信息,可以不带参数
except ZeroDivisionError as e:
    print(e)  #除0错误
 

 

异常嵌套

在try块和excep块中还可以分别再嵌套try-except块

 

assert断言

​    语法:assert 条件 [,异常描述字符串]

​     执行流程:如果条件为假,则抛出AssertionError,条件为真,就当assert不存在

​    作用:对于可能出问题的代码,加上断言,方便问题排查
 

print('start')
num = int(input('请输入一个1~9的整数:'))
assert 0 <num <=9,'num不在1~9'   # 'num不在1~9'时抛出异常
print('end')

自定义异常类

如果系统异常类型满足不了业务需求,那么可以自己定义异常类来处理。

- 自己定义的异常类必须继承BaseException或Exception
- 步骤:
  - 在自定义异常类的构造函数中,调用父类构造函数
  - 重写`__str__`方法输出异常信息
  - 编写异常处理方法处理异常

class CustomError(BaseException): #继承BaseException
    def __init__(self,msg):
        super().__init__()  #调用父类初始化
        self.msg = msg
        
    #重写__str__,输出异常信息
    def __str__(self):
        return self.msg
    
    #3.自定义异常处理方法
    def handle_exception(self):
        print('异常处理')
        
try:
    raise CustomError('自定义异常')
except CustomError as e:
    print(e)

 

 

 

 

 

 

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值