我有一个用例,我需要引发异常并再次抛出异常。为此,我在尝试和捕获中使用了 raise 关键字。代码如下
try:
username = input ("username:")
If Len(username) != 6:
raise Exception
except Exception:
raise Exception ("username is not valid")
这样做是正确的方法吗?在try
和except
块中引发异常是否符合编码标准?
我猜这是您实际用例的简化版本,在这种情况下,它通常是正确的。几点注意事项:
- 您可以使用
raise
之后没有任何内容来重新引发相同的错误。
try: raise ValueError('message') except ValueError: run_something() raise # will raise ValueError ('message')
- 不要
- 引发一般
Exception
,也不要捕获它们,要具体,否则此代码将掩盖其他错误并且难以调试。如果没有其他适合您的方法,请自己破例:
class MyException(Exception): pass
然后你可以使用它:
raise MyException('my message')
在您的用例中,如果我理解正确,所有这些加在一起将是:
class InvalidUsername(Exception):
pass
try:
username = input('username: ')
if len(username) > 6:
raise InvalidUsername('Username is too long')
if '!' in username:
raise InvalidUsername('Invalid character in username')
except InvalidUsername:
handle_invalid_user()
raise
控制台中的示例:
>>> try:
... username = input('username: ')
... if len(username) > 6:
... raise InvalidUsername('Username is too long')
... if '!' in username:
... raise InvalidUsername('Invalid character in username')
... except InvalidUsername:
... handle_invalid_user()
... raise
...
username: test1234
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
__main__.InvalidUsername: Username is too long
或者使用无效字符:
username: ofer!
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
__main__.InvalidUsername: Invalid character in username
我还希望在外部服务器的业务逻辑中由于数据库连接而出现错误时引发异常。
我遇到这个北极基本上是为了引发异常,特别是当您使用控制器>服务 ->存储库模式时。
https://flask.palletsprojects.com/en/2.1.x/errorhandling/
from flask import jsonify, request
class InvalidAPIUsage(Exception):
status_code = 400
def __init__(self, message, status_code=None, payload=None):
super().__init__()
self.message = message
if status_code is not None:
self.status_code = status_code
self.payload = payload
def to_dict(self):
rv = dict(self.payload or ())
rv['message'] = self.message
return rv
@app.errorhandler(InvalidAPIUsage)
def invalid_api_usage(e):
return jsonify(e.to_dict()), e.status_code
# an API app route for getting user information
# a correct request might be /api/user?user_id=420
@app.route("/api/user")
def user_api(user_id):
user_id = request.arg.get("user_id")
if not user_id:
raise InvalidAPIUsage("No user id provided!")
user = get_user(user_id=user_id)
if not user:
raise InvalidAPIUsage("No such user!", status_code=404)
return jsonify(user.to_dict())
[1]: https://flask.palletsprojects.com/en/2.1.x/errorhandling/
我希望这对正在开发企业级应用程序的开发人员有所帮助。