| |
|
|
| import gradio as gr |
| import time |
| import functools |
| from .notifications import notify_error, notify_warning, notify_success |
|
|
| class DWPoseEditorError(Exception): |
| """アプリケーション固有のエラー基底クラス""" |
| pass |
|
|
| class ModelLoadError(DWPoseEditorError): |
| """モデル読み込みエラー""" |
| pass |
|
|
| class PoseDetectionError(DWPoseEditorError): |
| """ポーズ検出エラー""" |
| pass |
|
|
| class ImageProcessingError(DWPoseEditorError): |
| """画像処理エラー""" |
| pass |
|
|
| def handle_error(error, context=""): |
| """統一エラーハンドラ""" |
| if isinstance(error, ModelLoadError): |
| notify_error("モデルの読み込みに失敗しました。しばらく待ってから再試行してください。") |
| return None |
| elif isinstance(error, PoseDetectionError): |
| notify_warning("ポーズを検出できませんでした。別の画像をお試しください。") |
| return None |
| elif isinstance(error, ImageProcessingError): |
| notify_error("画像の処理中にエラーが発生しました。") |
| return None |
| else: |
| notify_error(f"予期しないエラーが発生しました: {str(error)}") |
| return None |
|
|
| def with_retry(max_retries=3, delay=1.0): |
| """リトライ機能付きデコレータ""" |
| def decorator(func): |
| @functools.wraps(func) |
| def wrapper(*args, **kwargs): |
| last_exception = None |
| |
| for attempt in range(max_retries): |
| try: |
| return func(*args, **kwargs) |
| except Exception as e: |
| last_exception = e |
| if attempt < max_retries - 1: |
| print(f"リトライ {attempt + 1}/{max_retries}: {str(e)}") |
| time.sleep(delay) |
| else: |
| print(f"最大リトライ回数に達しました: {str(e)}") |
| |
| |
| if last_exception: |
| raise last_exception |
| |
| return None |
| return wrapper |
| return decorator |
|
|
| def safe_execute(operation, error_message="操作中にエラーが発生しました", show_error=True): |
| """安全な操作実行""" |
| try: |
| return operation() |
| except Exception as e: |
| print(f"Safe execute error: {str(e)}") |
| if show_error: |
| notify_error(error_message) |
| return None |