异常处理

异常处理:

错误分类: 1.语法错误:程序未执行之前python已经做了提示了,飘红状态.

例如: name , dic = { }  dic["key"]  只写这些内容就会报错.

2.逻辑错误: 分为可预知的,和不可预知的.

见过的: num = int(input(">>>"))  #ValueError

name  #NameError

if 1>0;  #SyntaxError

dic = {}

dic["key"]  #KeyError

等等很多很多

什么是异常?

有错误引发的,而且出现异常就会终止程序.

为什么要进行异常处理:

1.异常就会终止程序,用户体验极差.

2.让编写的代码更简洁.

异常处理:

1. if 异常处理 它只能处理简单的逻辑.

num= input("<<<")

if num.isdigit():

  num = int(num)

  if 1 <= num <= 5:

    ....

  else:

    print("有非数字类型")

2.try.异常处理

遇到报错信息,防止程序终止,执行另一个语句.

2.1 单独一个条件.单独.

try:

  num= int(input(">>>")) #ValueError

  name   #NameError

  dic = {}

  dic["key"]  #KeyError

except NameError:

  print("出现了NameError错误")

print(11111)

print(22222)

print(6666)

2.2 多分支

try:

  num = int(input(">>>"))  #ValueError

  name   #NameError

  dic = {}

  dic["key"]

except NameError:

  print("出现了NameError错误")

except ValueError:

  print("出现了ValueError错误")

except KeyError:

  print("出现了KeyError错误")

print(2222)

print(4444)

print(6666)

class A:

  def __str__(self):

    return "list index out of range"

a = A()

print(a)

3.万能异常处理

try:

  num = int(input(">>>"))  #ValueError

  name   #NameError

    dic = {}
       dic['key']    # KeyError

except Exception as e:

  print("你输入的不规范,请重新输入...)

异常处理的两种结局方式:

1.只是显示错误信息,不终止程序就行.    用万能的.

2.针对不同的错误,提示不同的信息,进行不同的操作.  用多分支 + 万能

def  login():

  pass

def  regsiter():

  pass

def  article():

  pass

def dariy():

  pass

dic = {

   1:login,

   2:regsiter,

   3:article,

   4:dariy,

}

while True:

  choice = input("请输入")

  if choice.isdigit():

    choice = int(choice)

    if 1<= choice <=4:

      dic[choice]()

    else:

      print("请输入范围内的数字")

  else:

    print("请输入数字...")

while True:

  try:

    choice = int(input("<<<<"))

    dic[choice]()

  except ValueError:

    print("请输入数字...")

  except KeyError:

    print("请输入范围内的数字")

while True:

  try:

    choice = int(input("请选择"))

    dic[choice]()

  except:      #这样写会报错,改成except Exception as e:这样就不会报错了

    print("请输入数字")

  except:

    print("请输入范围内的数字")

4.多分支 + 万能

while True:

  try: 

    choice = int(input('请输入:'))
    dic[choice]()
  except ValueError:
    print('请输入数字...')
  except Exception as e:
    print(e)
  except KeyError:
    print('请范围内的数字...')

try:
  choice = int(input('请输入:'))
except ValueError:
  print('请输入数字...')
except KeyError:
  print('请范围内的数字...')
except Exception as e:
  print(e)

2.5 try except except ....else

如果程序出现异常执行except,就不会执行else,反之则执行else.

try:

  print("我的卡扣除了100元")

  #name

  print("徐哥的卡增加了100元")

except NameError:

  print("转账出现异常")

else:

  print("转账成功")

2.6

try except except.... else  .finally

try finally

try:

  print("我的卡扣除了100元")

  #name

  print("旭哥的卡增加了100元")

except NameError:

  print("转账出现异常...")

else:

  print("转账成功")

finally:

  print(666666)

try:

  name

finally:

  print(6666)

出现错误先执行finally语句,经常用于关闭文件句柄,关闭数据库的连接,关闭网络链接等等.

try:

  f = open("t1",encoding = "utf-8")

  print(f.read())

  """多个文件句柄的操作"""

  f.write()

finally:

  f.close()

  print(666)

def func():

  try:

    return  555

  finally:

    """代码块"""

    print(666)

func()

try finally  出现错误先执行finally语句,经常应用于关闭文件句柄,关闭数据库,关闭网络连接等等.

2.7 主动触发异常

raise TypeError("类型错误")

class Payment:

  def pay(self,money):

    raise TypeError 3("类中应该用一个pay方法")

class  QQ(Payment):

  def pay(self,money):

    print("你用qq支付了%s元"% money)

class Wechat(Payment):

  def pay(self,money):

    print("你用微信支付了%s元"%money)

def pay(obj,money):

  obj.pay(money)

q = QQ()

w = Wechat()

pay(w,1000)

2.8 自定义异常(大项目,针对于python不具备的一些错误类型)

raise TypeError("类型错误")

name1 : python解释器没法解决的错误: nana

class nana(BaseException):

  def __init__(self.msg):

    self.msg = msg

  def __str__(self):

    return self.msg

try:

  raise nana("出错了")

except nana as e:  #e = nana("出错了")

  print(e)

断言 源码 主动抛出异常

condition = 1 > 2

assert condition #如果条件不满足强行终止

print(1111)

print(22222)

print(6666)

"""

1,try ...except 单个情况
2,try except except..... 多分支,针对多个你已知的异常,分别导向不同的代码. *
3,try except Exception as e: 万能异常处理. 你对出现的异常错误未知,你要用万能的. *
# 1,只是显示错误信息,不终止程序就行. 万能的
# 2,针对不同的错误,提示不同的信息,进行不同的操作. 多分支,多分支+ 万能
4,try except except except Exception as e: 多分支 + 万能 *

5,try except except... else 出现异常就不执行else代码反之则执行.
6,
try except except... else,finally 不常用
try finally * 涉及到关闭文件句柄,网络链接,数据库链接等等.
7, raise
8, 自定义异常处理.
9 assert

"""

原文地址:https://www.cnblogs.com/fengkun125/p/9300688.html