Decorator for graceful error handling of tool operations. Args: tool_name: Name of the tool fallback_value: Value to return if tool fails log_level: Log level for errors Example: @handle_tool_error("nmap", fallback_value=[]) async def sca
(
tool_name: str,
fallback_value=None,
log_level: str = "warning",
)
| 107 | def handle_tool_error( |
| 108 | tool_name: str, |
| 109 | fallback_value=None, |
| 110 | log_level: str = "warning", |
| 111 | ): |
| 112 | """Decorator for graceful error handling of tool operations. |
| 113 | |
| 114 | Args: |
| 115 | tool_name: Name of the tool |
| 116 | fallback_value: Value to return if tool fails |
| 117 | log_level: Log level for errors |
| 118 | |
| 119 | Example: |
| 120 | @handle_tool_error("nmap", fallback_value=[]) |
| 121 | async def scan_ports(target): |
| 122 | # nmap code |
| 123 | pass |
| 124 | """ |
| 125 | def decorator(func): |
| 126 | async def wrapper(*args, **kwargs): |
| 127 | try: |
| 128 | return await func(*args, **kwargs) |
| 129 | except ToolNotFoundError as e: |
| 130 | logger.log( |
| 131 | level=getattr(logger, log_level.upper()), |
| 132 | msg=f"Skipping {tool_name}: {e}" |
| 133 | ) |
| 134 | return fallback_value |
| 135 | except ToolExecutionError as e: |
| 136 | logger.log( |
| 137 | level=getattr(logger, log_level.upper()), |
| 138 | msg=f"{tool_name} execution failed: {e.error}" |
| 139 | ) |
| 140 | return fallback_value |
| 141 | except Exception as e: |
| 142 | logger.error(f"Unexpected error in {tool_name}: {e}") |
| 143 | return fallback_value |
| 144 | |
| 145 | return wrapper |
| 146 | |
| 147 | return decorator |
nothing calls this directly
no outgoing calls
no test coverage detected