python捕获异常 & 主动抛出异常

# 捕获异常

# DATE: 20190706
# DESCRIPTION: 捕获异常(try except)

try:
	num = int(input("please input an integer: "))
	res = 10 / num
	print(res)
	
except ValueError:
	print("值错误")
# except ZeroDivisionError:
	# print("除0错误")
	
# Exception 捕获未知错误
except Exception as unknown_err:
	print("unknown error: %s" % unknown_err)
	
else: 	# 没有异常才会执行的代码
	print("==> success !")
	
finally: # 无论是否有异常,都会执行的代码
	print("==> anyway...")

# 主动抛出异常

# DATE: 20190706
# DESCRIPTION: 主动抛出异常
#       用户输入密码,长度<8抛出异常,长度>=8返回异常

def input_password():
    pwd = input("请输入密码:")
    if len(pwd) >= 8:
        return pwd
    
    # 创建异常对象
    exc = Exception("密码长度不够")
    # 主动抛出异常
    raise exc
    
try:
    print(input_password())
except Exception as unknown_err:
    print("未知异常:%s" % unknown_err)

 

### Python主动抛出异常的方法 在 Python 编程中,`raise` 关键字用于主动抛出异常。通过这种方式,开发者可以根据特定的业务需求,在满足某些条件时触发异常处理机制[^1]。 以下是实现主动抛出异常的具体方法: #### 使用 `Exception` 类主动抛出异常 可以通过创建一个 `Exception` 对象并结合 `raise` 来抛出异常。例如,当用户输入的密码长度不足 8 位时,可以主动抛出异常以提示错误信息[^1]。 ```python def input_password(): mm = input(&quot;请输入密码:&quot;) if len(mm) &gt;= 8: return mm mmyc = Exception(&quot;密码长度不能少于8位&quot;) # 创建异常对象 raise mmyc # 抛出异常 ``` 主程序部分需要使用 `try-except` 结构来捕获异常,从而避免程序因未处理的异常而中断运行[^3]。 ```python try: print(f&quot;密码为:{input_password()}&quot;) except Exception as wzyc: print(f&quot;未知异常:{wzyc}&quot;) ``` --- #### 自定义异常类 为了更精确地描述特定场景下的异常情况,可以继承内置的 `Exception` 类来自定义异常类型[^2]。下面是一个示例,展示如何定义和使用自定义异常类。 ```python class PasswordTooShortError(Exception): def __init__(self, message=&quot;密码长度过短&quot;): super().__init__(message) def validate_password(password): if len(password) &lt; 8: raise PasswordTooShortError(&quot;密码长度不能小于8位&quot;) return password ``` 在实际应用中,这种做法能够提高代码可读性和维护性,使不同类型的异常更加清晰明了[^4]。 --- #### 主动抛出异常的实际应用场景 有时即使程序逻辑本身不会引发系统级异常,但从业务角度来看仍然存在一些特殊状况需要特别对待。此时就可以利用 `raise` 手工制造相应的警告或停止信号[^5]。 比如在一个订单管理系统里判断是否有新的有效订单到来: ```python class NoNewOrderError(Exception): pass class TestOrderError(Exception): def __init__(self, order_name): self.order_name = order_name def __str__(self): return f&quot;检测到测试单 {self.order_name}&quot; def check_order(order_list): if not order_list: raise NoNewOrderError(&quot;无新单&quot;) for order in order_list: name = order.get(&#39;name&#39;, &#39;&#39;) if name in [&quot;测试1&quot;, &quot;测试2&quot;]: raise TestOrderError(name) return True ``` 以上例子展示了两种可能发生的特殊情况&mdash;&mdash;没有任何新订单以及遇到特殊的测试订单,并分别给出了对应的解决方案。 --- #### 总结注意事项 无论何时何地都应记得对所有潜在风险点加以防护措施;即便是人为设定好的规则也有可能被违反,所以务必做好充分准备去迎接各种意外情形的发生。只有这样才能够构建起健壮可靠的软件产品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值