python基础-异常处理try-except

Python目前(至少)有两种可区分的错误:语法错误和异常。异常是指在语法正确的情况下执行时引发的错误。有时候我们需要处理这些异常,就会用到try-except语句。

try-except

while True:
    try:
        x = int(input("请输入一个整数: "))
        y = 12 / x
        print("被12除得到的结果:{}".format(y))
        break
    except ValueError:           #ValueError: invalid literal for int() with base 10: 'art'
        print("无效的数字,请重试!")
    except ZeroDivisionError as err:       #ZeroDivisionError: division by zero
        print('除数不能为0:', err)

当出现ValueError的异常时:

请输入一个整数: art
无效的数字,请重试!
请输入一个整数: 12
被12除得到的结果:1.0

当出现ZeroDivisionError的异常时

请输入一个整数: 0
除数不能为0: division by zero
请输入一个整数: 12
被12除得到的结果:1.0

一个 except 子句可以将多个异常命名为带括号的元组

except (ValueError, ZeroDivisionError):
	pass

try-except-else

try ... except 语句有一个可选的 else 子句,在使用时必须放在所有的 except子句后面。用来编写在 try 子句不引发异常时必须执行的代码。

while True:
    try:
        x = int(input("请输入一个整数: "))
        y = 12 / x
        print("被12除得到的结果:{}".format(y))
        #break       #这个break和下面的else语句有冲突,有break下面的else语句就会执行不到
    except ValueError:
        print("无效的数字,请重试!")
    except ZeroDivisionError as err:
        print('除数不能为0:', err)
    #try语句中的代码不报错时执行下面的
    else:
        print("输入的整数是:{0},计算得到的结果是:{1}".format(x,y))
        break

程序运行如下:

请输入一个整数: 12
被12除得到的结果:1.0
输入的整数是:12,计算得到的结果是:1.0

try-except-else-finally

try语句有另一个可选子句,用于定义必须在所有情况下执行的清理操作。

  • 如果在执行 try 子句期间发生了异常,该异常可由一个 except 子句进行处理。 如果异常没有被某个 except 子句所处理,则该异常会在 finally 子句执行之后被重新引发。

  • 异常也可能在 except 或 else 子句执行期间发生。 同样地,该异常会在 finally 子句执行之后被重新引发。

  • 如果在执行 try 语句时遇到一个 break, continue 或 return 语句,则 finally 子句将在执行 break, continue 或 return 语句之前被执行。

  • 如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 子句的某个 return 语句的返回值,而非来自 try 子句的 return 语句的返回值。

官方文档中的例子:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不能为0!")
    else:
        print("计算结果为:", result)
    finally:
        print("执行finally语句!")

参数正确:

divide(2,1)
计算结果为: 2.0
执行finally语句!

除数参数输入0:

divide(2,0)
除数不能为0!
执行finally语句!

参数不为整数:

divide("2","1")
Traceback (most recent call last):
  File "D:/code/exercise/blog/error.py", line 36, in 
    divide("2","1")
  File "D:/code/exercise/blog/error.py", line 28, in divide
    result = x / y
执行finally语句!
TypeError: unsupported operand type(s) for /: 'str' and 'str'

raise

raise 语句允许程序员强制发生指定的异常。用于主动抛出异常。
raise 唯一的参数就是要抛出的异常。这个参数必须是一个异常实例或者是一个异常类(派生自 Exception 的类)。

raise NameError("这是一个NameError!")

执行:

Traceback (most recent call last):
  File "D:/code/exercise/blog/error.py", line 42, in 
    raise NameError("这是一个NameError!")
NameError: 这是一个NameError!

用户自定义的异常

可以通过创建新的异常类来自定义异常。异常通常应该继承Exception类。
下面是一个selenium封装定位方法中的例子:

class LocatorTypeError(Exception):
	# 定位元素输入类型错误的异常
    pass
    
def find(locator):
    if not isinstance(locator, tuple):
        raise LocatorTypeError("参数类型错误,locator必须是元组类型,loc = ('id','value1')")

定义的异常类,通常保持简单,可以提供一些属性,为异常提取有关错误的信息。

class IdError(Exception):
    #输入id错误的异常
    def __init__(self, input_id):
        self.input_id = input_id

def query_user(id):
    if not isinstance(id,int):
        raise IdError("id{}输入错误,用户id必须是整型".format(IdError(id).args))

query_user("sdsadasds")

执行:

Traceback (most recent call last):
  File "D:/code/exercise/blog/error.py", line 47, in 
    query_user("sdsadasds")
  File "D:/code/exercise/blog/error.py", line 45, in query_user
    raise IdError("id{}输入错误,用户id必须是整型".format(IdError(id).args))
__main__.IdError: id('sdsadasds',)输入错误,用户id必须是整型

python内置异常类型查阅

你可能感兴趣的:(python基础,python)