013.Python基础--异常/错误处理

异常处理 & 语法错误

语法错误:简而言之,就是你的代码写错了

异常:  即使是你的代码在语法上没有任何错误,也可能引发错误,我们称为异常

万能的 try except 语句:

在try程序段中,我们放入容易犯错的部分。后面可以跟上except

执行方式:

  • 首先,执行 try 子句 (在 try 和 except 关键字之间的部分)。

  • 如果没有异常发生, except 子句 在 try 语句执行完毕后就被忽略了。

  • 如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。

    如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的except子句。然后继续执行 try 语句之后的代码。

  • 如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。

    如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息。

我们来写一个:

try:

  print(a*2)

except TypeError:

  print('TypeError')

当然except 后面可跟多个错误类型

try:

  print(a*2)

except (TypeError,RuntimeError,NameError):

  print('error')

try except 加上else语句

当 try 语句没有抛出异常时,需要执行一些代码,可以使用这个子句

使用 else 子句比在 try 子句中附加代码要好,因为这样可以避免 try … except 意外的截获本来不属于它们保护的那些代码抛出的异常

我们来比较一下:

例子1(try子句没有问题):

a = 1

try:

  print(a*2)

except (TypeError,RuntimeError,NameError):

  print('error')

else:

  print('ok')

此时将会输出 2 no

例子2(try子句有异常):

try:

  print(a*2)

except (TypeError,RuntimeError,NameError):

  print('error')

else:

  print('ok')

此时将会输出 ok

抛出异常——raise (强制抛出一个指定的异常)

来 先强制抛一个异常再说:

raise NameError('this is a error')

程序将会输出 this is a error这样的错误叫NameError

当你需要明确一个异常是否抛出时,又不想处理它,raise可以让它重新抛出异常

try:

  raise NameError('this is a error')

except NameError:

  print('this error is going')

raise

程序输出this error is going 但是最后还是会抛出 this is a error

自定义异常(类)

异常类通常应该直接或间接的从 Exception 类派生

先写一个:

class my_error(Exception):

  def __init__(self,value):

    self.value = value

  def __str__(self):

    return repr(self.value)

#调用我们的my_error类

try:

  raise my_error(2*2)

except my_error as e:

  print('error is,value:','e.value')

*********不想写了,这个异常能干什么呢????哈哈哈哈哈**********

最后写个清理行为finally

不管有没有发生异常,finally子句 在程序离开 try 后都一定会被执行

当 try 语句中发生了未被 except 捕获的异常(或者它发生在 except 或 else 子句中)在 finally 子句执行完后它会被重新抛出

 try 语句经由 break ,continue 或 return 语句退 出也一样会执行 finally 子句

def func(x, y):

try:

  result = x / y

except ZeroDivisionError:

  print("division by zero!")

else:

  print("result is", result)

finally:

  print("executing finally clause")

func(2,1)

原文地址:https://www.cnblogs.com/zhouA/p/14506616.html