Python中关于异常处理的问题

像这种有什么优雅的处理方法?

try..except ? 但是错误异常太多了(像这个 exc.DataError,其他的还有 OptionError ),一个个 except ?


Python中关于异常处理的问题
3 回复

在Python里处理异常,核心就三件事:用 try/except 抓住错误、用 else/finally 做收尾、该抛异常时就抛异常。下面是一个典型场景的完整代码:

def process_data(data):
    """处理数据,演示完整的异常处理结构"""
    result = None
    try:
        # 主要业务逻辑
        if not data:
            raise ValueError("数据不能为空")  # 主动抛出异常
        
        result = int(data) * 2  # 可能触发 ValueError
        
    except ValueError as e:
        print(f"数据格式错误: {e}")
        # 可以在这里处理或重新抛出
        raise  # 重新抛出给上层
        
    except (TypeError, KeyError):
        print("发生了类型或键错误")
        
    except Exception as e:
        print(f"未知错误: {e}")
        # 记录日志等操作
        
    else:
        # 只有当try块没有异常时才执行
        print(f"处理成功,结果是: {result}")
        
    finally:
        # 无论是否异常都会执行,适合清理资源
        print("清理资源...")
        
    return result

# 测试用例
if __name__ == "__main__":
    # 正常情况
    print("测试1:", process_data("10"))
    
    # 触发ValueError
    try:
        print("测试2:", process_data("abc"))
    except ValueError:
        print("外层捕获到ValueError")
    
    # 空数据
    try:
        print("测试3:", process_data(""))
    except ValueError as e:
        print(f"外层捕获: {e}")

关键点:

  1. 精确捕获:先捕获具体的异常(如ValueError),最后用Exception兜底
  2. 异常传递:在except里用raise重新抛出,让调用者知道出错
  3. 资源清理:finally块确保文件关闭、连接释放等操作一定执行
  4. else用途:把正常逻辑和异常处理分开,代码更清晰

总结:异常处理要精确,别用裸except。


The base exception class is SQLAlchemyError. Exceptions which are raised as a result of DBAPI exceptions are all subclasses of DBAPIError.

#1

from sqlalchemy.exc import DBAPIError, SQLAlchemyError

try:
# code
except DBAPIError:
print(‘dbapi’)
except SQLAlchemyError:
print(‘sqlalchemy’)


然而并没有什么事情发生

回到顶部