异常处理

Posted wang-kai-1994

tags:

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

异常处理

""" ? 异常可以由 发生的时间不同分为两类

1.语法检测异常 ? 解释器在执行代码前会先检测语法 检测通过才会开始执行 ? 如果这个阶段发生了异常 代码一行都不会执行 ? 语法错误 和 缩进错误

2.运行时异常 ? 已经通过了语法检测 在解析执行期间发生的异常

 

代码1:

# 语法1
?
try:
?
# 把可能发出错误的代码放到try中
?
  print("start")
?
# a = int("abc")
?
  li[1]
  print("over")
?
except ValueError:
?
# 当try中真的发生了错误 就会执行 except中的代码
?
# 在这里可以做一些补救措施
?
  print("发生了 ValueError异常")
?
print("over")

 

代码2:

# 语法2 except可以有多个
?
try:
?
# 把可能发出错误的代码放到try中
?
  print("start")
  a = int("abc")
  li[1]
  print("over")
?
except ValueError:
?
# 当try中真的发生了错误 就会执行 except中的代码
?
# 在这里可以做一些补救措施
?
  print("发生了 ValueError异常")
except IndexError:
  print("发生了 IndexError 索引不正确")
print("over")
?
?
?
?

 

代码3:

语法3
万能异常 Exception类 尽量少用 
可能会导致 程序既不报错 也不正常运行 无法定位错误位置
?
try:
?
# 把可能发出错误的代码放到try中
?
print("start")
?
# a = int("abc")
?
# li[1]
?
  10 / 0
  dic = {}
  dic["name"]
  print("over")
?
except Exception:
  print("可能是任何类型的错误 反正是发生错误了")
print("over")

 

代码4:

语法4
?
万能异常 Exception类 建议 输出异常的值
?
try:
?
# 把可能发出错误的代码放到try中
?
  print("start")
?
# a = int("abc")
?
# li[1]
?
  10 / 0
  dic = {}
  dic["name"]
  print("over")
?
# 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
?
except Exception as e:
  print("可能是任何类型的错误 反正是发生错误了")
  print(e)
  print(type(e))
print("over")
?
?

 

代码5:

# 语法5
先捕获能够明确的异常类型 最后捕获万能异常类型
?
try:
?
# 把可能发出错误的代码放到try中
?
  print("start")
?
# a = int("abc")
?
# li[1]
?
# 10 / 0
?
  dic = {}
  dic["name"]
  print("over")
except ValueError:
  print("值不对.....")
except ZeroDivisionError:
  print("除数不能为0")
?
# 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
?
except Exception as e:
  print("可能是任何类型的错误 反正是发生错误了")
  print(e)
  print(type(e))
?
print("over")

 

 

代码6:

语法6
# try except else
try:
?
# 把可能发出错误的代码放到try中
?
  print("start")
?
# a = int("abc")
?
# li[1]
?
# 10 / 0
?
  dic = {}
?
# dic["name"]
?
  print("over")
except ValueError:
  print("值不对.....")
except ZeroDivisionError:
  print("除数不能为0")
?
# 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息
?
except Exception as e:
  print("可能是任何类型的错误 反正是发生错误了")
  print(e)
  print(type(e))
else: #当没有发生异常会执行else   只能except的后面
  print("执行了else")
print("over")

 

 

代码7:

语法7 
try except finally
try:
?
# 把可能发出错误的代码放到try中
?
  print("start")
?
# a = int("abc")
?
# li[1]
?
# 10 / 0
?
  dic = {}
?
# dic["name"]
?
  print("over")
except ValueError:
  print("值不对.....")
finally: #无论是否发生异常 最后都会执行finally中的代码
  print("finally")
print("over")
?
import io
?
# finally的使用场景 可以用finally来执行一些清理操作 类似__del__
?
try:
  print("start")
  f = open("1.今日内容","rt",encoding="utf-8")
  f.read()
  print("end")
except FileNotFoundError:
  print("文件路径错误...")
except io.UnsupportedOperation:
  print("文件不能被写入....")
finally:
  f.close()
?
print(f.closed)
?
?

 

 

完整的书写顺序
  1. try

  2. except

  3. else

  4. finally

需要掌握的语法

 

  1. try: except:

2.

try: ? except: ? finally:

正确使用异常处理

 

  1. 如果能明确知道异常发生原因 就不要产生异常 使用if判断等方式

  2. 不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常

  3. 不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息

 

 

 

自定义异常

 

需求:

做一个登录功能 如果登录失败就抛异常

主动抛出异常
  • 当你写了一些功能 是提供给别人用的 然而使用者不按照你的方式来使用, 就会导致程序出错

  • 而且我们无法帮助用户处理这个错误

  • 这时候就可以主动抛出异常

  • raise 关键字 后面跟 任意Exception类型的子类

自定义异常类型

代码1:

class LoginException(Exception):
  pass
?
def login():
  name = input("username:").strip()
  pwd = input("password:").strip()
?
  if name == "blex" and pwd == "123":
      print("登录成功!")
  else:
      raise LoginException("用户名或密码不正确....")
?
login()



断言

断言

  1. 其实就是断定意思 我很确定某个条件一定成立的

  2. 有一段代码 要执行必须要保证某个条件是成立的

鸡肋功能

 

代码1:

有一堆姓名 需要被处理
names = ["张三","李四","王麻子"]
一定要保证列表中有数据需要被处理
if not names:
  raise TypeError("没有数据需要处理....")
?
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")

 

代码2

names = []
使用断言来简化代码   断言后面跟一个bool类型表达式 如果结果为True则继续往下执行
否则直接抛出异常 AssertionError
其局限性是 异常类型是固定的 而且不能指定异常信息
assert names
?
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")
print("正在处理这堆数据....")

 

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

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

Java异常处理机制

java 反射代码片段

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

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

片段中的Android致命异常