プロジェクト

全般

プロフィール

バグ #509

未完了

詳細エラーハンドリング戦略

Redmine Admin さんが8日前に追加.

ステータス:
新規
優先度:
高め
担当者:
-
開始日:
2025-06-11
期日:
進捗率:

0%

予定工数:

説明

概要

レジュメ変換システムのエラーハンドリング戦略を詳細に定義します。想定されるエラーケース、エラー処理方法、リトライ戦略、ユーザー向けエラーメッセージなどを詳細に規定します。

作業内容

  1. 想定エラーケースのカタログ化

    • ファイル関連エラー
      • 未対応形式のファイル
      • サイズ超過ファイル
      • パスワード保護されたファイル
      • 破損ファイル
      • スキャン画像のみのPDF
    • API関連エラー
      • 認証エラー
      • 権限エラー
      • リソース不足エラー
      • レート制限エラー
    • AI処理エラー
      • タイムアウト
      • モデル応答エラー
      • 解析失敗
      • 構造化データ変換エラー
    • データベースエラー
      • 接続エラー
      • クエリエラー
      • 整合性違反
      • タイムアウト
    • その他システムエラー
      • メモリ不足
      • ディスク容量不足
      • 依存サービス障害
  2. エラー処理方針の詳細化

    • バックエンドエラー処理

      // グローバルエラーハンドラー
      app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
        // エラーログ記録
        logger.error('Unhandled error', {
          error: err.message,
          stack: err.stack,
          url: req.originalUrl,
          method: req.method,
          user: req.user?.id || 'anonymous'
        });
      
        // エラー種別の判定
        if (err instanceof ValidationError) {
          return res.status(400).json({
            error: 'ValidationError',
            message: 'リクエストデータに問題があります',
            details: err.details
          });
        }
      
        if (err instanceof AuthenticationError) {
          return res.status(401).json({
            error: 'AuthenticationError',
            message: '認証に失敗しました'
          });
        }
      
        // その他エラー処理
        // ...
      
        // 想定外エラーは500
        res.status(500).json({
          error: 'InternalServerError',
          message: '予期せぬエラーが発生しました'
        });
      });
      
    • フロントエンドエラー処理

      // エラーハンドリングカスタムフック
      const useErrorHandler = () => {
        const [error, setError] = useState<Error | null>(null);
        const [isVisible, setIsVisible] = useState(false);
      
        const handleError = useCallback((err: Error | string) => {
          const errorObj = typeof err === 'string' ? new Error(err) : err;
          setError(errorObj);
          setIsVisible(true);
      
          // エラー種別に応じた処理
          if (errorObj.name === 'AuthenticationError') {
            // 認証エラー処理
          } else if (errorObj.name === 'NetworkError') {
            // ネットワークエラー処理
          }
          // その他エラー処理
        }, []);
      
        const clearError = useCallback(() => {
          setError(null);
          setIsVisible(false);
        }, []);
      
        return { error, isVisible, handleError, clearError };
      };
      
  3. リトライ戦略の詳細化

    • 再試行が有効なエラーの定義
    • 再試行回数と間隔の設定
    const retryableErrors = [
      'NETWORK_ERROR',
      'TIMEOUT_ERROR',
      'SERVICE_UNAVAILABLE',
      'TOO_MANY_REQUESTS'
    ];
    
    const retryStrategy = {
      maxRetries: 3,
      initialDelay: 1000, // 1秒
      maxDelay: 10000,    // 10秒
      factor: 2,          // 指数バックオフ
      shouldRetry: (err: Error) => {
        // 再試行すべきエラーかの判定
      }
    };
    
    • バックオフ戦略(指数、線形、ランダム)
    • 永続的失敗時の対応
  4. ユーザー向けエラーメッセージの詳細化

    • エラー種別ごとのメッセージテンプレート
    • 親切で解決方法を示唆するメッセージ設計
    • 技術的詳細の適切な隠蔽
    • 多言語対応設計
  5. エラーモニタリングと分析

    • エラーログ形式の定義
    • 集中ログ管理の設計
    • エラー傾向分析手法
    • アラート設定

成果物

  • エラーケースカタログ
  • バックエンドエラーハンドリング実装
  • フロントエンドエラーハンドリング実装
  • リトライ戦略定義
  • ユーザー向けエラーメッセージ集
  • エラーモニタリング設計

技術スタック

  • TypeScript
  • Express.js
  • React
  • エラーログライブラリ

参照

  • 親チケット: #470(DB設計・バックエンド基盤構築)
  • 関連チケット: #486(バックエンドミドルウェア実装)
  • 関連チケット: #497(AI連携基盤構築)
  • 関連チケット: #501(AI処理キューイング実装)

表示するデータがありません

他の形式にエクスポート: Atom PDF