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 <module>
    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 <module>
    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 <module>
    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内置异常类型查阅

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中的 try-except 语句用于捕获并处理异常。当代码执行过程中发生异常时,程序会停止执行并抛出异常信息。如果不处理这些异常,程序就会终止。因此,我们需要使用 try-except 语句来捕获并处理异常,以保证程序的正常运行。 语法如下: ```python try: # 可能会出现异常的代码块 except Exception1: # 异常类型1的处理方式 except Exception2: # 异常类型2的处理方式 else: # 如果 try 块没有抛出任何异常,则执行 else 块 finally: # 不管是否有异常发生,都会执行 finally 块 ``` try 语句块中包含可能会出现异常的代码,如果代码块中有异常抛出,则会自动跳转到相应的 except 块中进行异常处理。 except 块用于捕获特定类型的异常,并提供相应的处理方式。如果不指定异常类型,则会捕获所有类型的异常。可以在一个 try 语句中包含多个 except 块,以处理不同类型的异常。 else 块在 try 块没有抛出任何异常时执行,用于定义在没有异常发生时要执行的代码。 finally 块在无论是否有异常发生时都会执行,用于定义一些必须执行的代码,例如释放资源等。 Python 中常见的异常类型包括: - AttributeError:当访问对象的属性或方法不存在时抛出。 - NameError:当访问未定义的变量时抛出。 - TypeError:当操作或函数应用于不支持它的对象类型时抛出。 - ValueError:当传递给函数的参数不正确时抛出。 - ZeroDivisionError:当除数为零时抛出。 例如: ```python try: num1 = int(input("请输入一个整数:")) num2 = int(input("请输入另一个整数:")) result = num1 / num2 print("结果为:", result) except ValueError: print("请输入整数") except ZeroDivisionError: print("除数不能为零") except: print("发生了其他异常") else: print("计算完成") finally: print("程序结束") ``` 在这个例子中,我们尝试将用户输入的两个字符串转换为整数,并计算它们的商。如果输入的不是整数,会抛出 ValueError 异常;如果除数为零,会抛出 ZeroDivisionError 异常。如果发生其他异常,则会捕获所有异常。如果没有异常发生,则打印计算结果。不管有没有异常发生,都会打印“程序结束”。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值