feat: Implement unified error handling system

- Added `errors.py` to define a centralized error management system with error codes and metadata.
- Created `VRCTError` class for generating standardized error responses.
- Introduced `error_handling_migration_guide.md` to document migration patterns for existing error handling to the new system.
- Updated error handling patterns in the codebase to utilize the new error management system.
This commit is contained in:
misyaguziya
2026-01-02 19:38:06 +09:00
parent cab7d48de1
commit b0cf8bf335
3 changed files with 1227 additions and 461 deletions

View File

@@ -0,0 +1,212 @@
# エラーハンドリング統一システム移行ガイド
## 概要
`errors.py`で定義された統一エラーシステムを使用して、すべてのエラーハンドリングを標準化しました。
## 変更パターン
### 1. 基本的なエラーレスポンス
#### 修正前:
```python
response = {
"status": 400,
"result": {
"message": "Error message",
"data": some_value
}
}
```
#### 修正後:
```python
from errors import ErrorCode, VRCTError
response = VRCTError.create_error_response(
ErrorCode.APPROPRIATE_ERROR_CODE,
data=some_value
)
```
### 2. run_mapping経由のエラー通知
#### 修正前:
```python
self.run(
400,
self.run_mapping["error_device"],
{
"message": "No mic device detected",
"data": None
},
)
```
#### 修正後:
```python
error_response = VRCTError.create_error_response(
ErrorCode.DEVICE_NO_MIC,
data=None
)
self.run(
error_response["status"],
self.run_mapping["error_device"],
error_response["result"],
)
```
### 3. 例外からのエラー生成
#### 修正前:
```python
except Exception as e:
errorLogging()
response = {
"status": 400,
"result": {
"message": f"Error {e}",
"data": original_value
}
}
```
#### 修正後:
```python
except Exception as e:
errorLogging()
response = VRCTError.create_exception_error_response(
e,
data=original_value
)
```
## 既に移行済みの箇所
### デバイスエラー
-`progressBarMicEnergy` - `ErrorCode.DEVICE_NO_MIC`
-`progressBarSpeakerEnergy` - `ErrorCode.DEVICE_NO_SPEAKER`
### ウェイトダウンロードエラー
-`DownloadCTranslate2.downloaded` - `ErrorCode.WEIGHT_CTRANSLATE2_DOWNLOAD`
-`DownloadWhisper.downloaded` - `ErrorCode.WEIGHT_WHISPER_DOWNLOAD`
### 翻訳エラー
-`micMessage` - `ErrorCode.TRANSLATION_ENGINE_LIMIT`, `ErrorCode.TRANSLATION_VRAM_MIC`, `ErrorCode.TRANSLATION_DISABLED_VRAM`
-`speakerMessage` - `ErrorCode.TRANSLATION_ENGINE_LIMIT`, `ErrorCode.TRANSLATION_VRAM_SPEAKER`, `ErrorCode.TRANSLATION_DISABLED_VRAM`
-`chatMessage` - `ErrorCode.TRANSLATION_ENGINE_LIMIT`, `ErrorCode.TRANSLATION_VRAM_CHAT`, `ErrorCode.TRANSLATION_DISABLED_VRAM`
-`setEnableTranslation` - `ErrorCode.TRANSLATION_VRAM_ENABLE`, `ErrorCode.TRANSLATION_DISABLED_VRAM`
### バリデーションエラー
-`setMicThreshold` - `ErrorCode.VALIDATION_MIC_THRESHOLD`
-`setSpeakerThreshold` - `ErrorCode.VALIDATION_SPEAKER_THRESHOLD`
-`setMicRecordTimeout` - `ErrorCode.VALIDATION_MIC_RECORD_TIMEOUT`
-`setMicPhraseTimeout` - `ErrorCode.VALIDATION_MIC_PHRASE_TIMEOUT`
-`setMicMaxPhrases` - `ErrorCode.VALIDATION_MIC_MAX_PHRASES`
-`setSpeakerRecordTimeout` - `ErrorCode.VALIDATION_SPEAKER_RECORD_TIMEOUT`
-`setSpeakerPhraseTimeout` - `ErrorCode.VALIDATION_SPEAKER_PHRASE_TIMEOUT`
-`setSpeakerMaxPhrases` - `ErrorCode.VALIDATION_SPEAKER_MAX_PHRASES`
-`setOscIpAddress` - `ErrorCode.VALIDATION_INVALID_IP`, `ErrorCode.VALIDATION_CANNOT_SET_IP`
### VRC連携エラー
-`setEnableVrcMicMuteSync` - `ErrorCode.VRC_MIC_MUTE_SYNC_OSC_DISABLED`
### 認証エラー
-`setDeeplAuthKey` - `ErrorCode.AUTH_DEEPL_LENGTH`, `ErrorCode.AUTH_DEEPL_FAILED`
## 未移行の箇所(要対応)
以下の箇所は同様のパターンで移行が必要です:
### 認証関連
-`setPlamoAuthKey` - `ErrorCode.AUTH_PLAMO_LENGTH`, `ErrorCode.AUTH_PLAMO_FAILED`
-`setPlamoModel` - `ErrorCode.MODEL_PLAMO_INVALID`
-`setGeminiAuthKey` - `ErrorCode.AUTH_GEMINI_LENGTH`, `ErrorCode.AUTH_GEMINI_FAILED`
-`setGeminiModel` - `ErrorCode.MODEL_GEMINI_INVALID`
-`setOpenAIAuthKey` - `ErrorCode.AUTH_OPENAI_INVALID`, `ErrorCode.AUTH_OPENAI_FAILED`
-`setOpenAIModel` - `ErrorCode.MODEL_OPENAI_INVALID`
-`setGroqAuthKey` - `ErrorCode.AUTH_GROQ_INVALID`, `ErrorCode.AUTH_GROQ_FAILED`
-`setGroqModel` - `ErrorCode.MODEL_GROQ_INVALID`
-`setOpenRouterAuthKey` - `ErrorCode.AUTH_OPENROUTER_INVALID`, `ErrorCode.AUTH_OPENROUTER_FAILED`
-`setOpenRouterModel` - `ErrorCode.MODEL_OPENROUTER_INVALID`
### 接続関連
-`checkTranslatorLMStudioConnection` - `ErrorCode.CONNECTION_LMSTUDIO_FAILED`
-`setTranslatorLMStudioURL` - `ErrorCode.CONNECTION_LMSTUDIO_URL_INVALID`
-`setTranslatorLMStudioModel` - `ErrorCode.MODEL_LMSTUDIO_INVALID`
-`checkTranslatorOllamaConnection` - `ErrorCode.CONNECTION_OLLAMA_FAILED`
-`setTranslatorOllamaModel` - `ErrorCode.MODEL_OLLAMA_INVALID`
### WebSocket関連
-`setWebSocketHost` - `ErrorCode.VALIDATION_INVALID_IP`, `ErrorCode.WEBSOCKET_HOST_INVALID`
-`setWebSocketPort` - `ErrorCode.WEBSOCKET_PORT_UNAVAILABLE`
-`setEnableWebSocketServer` - `ErrorCode.WEBSOCKET_SERVER_UNAVAILABLE`
### 音声認識VRAM関連
-`startTranscriptionSendMessage` - `ErrorCode.TRANSCRIPTION_VRAM_MIC`, `ErrorCode.TRANSCRIPTION_SEND_DISABLED_VRAM`
-`startTranscriptionReceiveMessage` - `ErrorCode.TRANSCRIPTION_VRAM_SPEAKER`, `ErrorCode.TRANSCRIPTION_RECEIVE_DISABLED_VRAM`
## エラーコードとエンドポイントの対応
`errors.py``ENDPOINT_ERROR_MAPPING`に、すべてのエンドポイントとエラーコードの対応が定義されています。
UI開発者はこのマッピングを参照して、各エンドポイントがどのようなエラーを返すか確認できます。
## エラーレスポンスの構造
統一されたエラーレスポンスは以下の構造を持ちます:
```python
{
"status": 400, # HTTPステータスコード
"result": {
"error_code": "ERROR_CODE_CONSTANT", # エラーコード定数
"message": "Human readable message", # 人間が読めるメッセージ
"data": None or original_value, # エラー時に戻す値(通常は元の値)
"details": {}, # 追加情報(オプション)
"category": "category_name", # エラーカテゴリ
"severity": "warning|error|critical", # 重要度
}
}
```
## UI側での活用
UI側では`error_code`を使用して、エラーの種類を判定し、適切な処理を行うことができます:
```javascript
if (response.status === 400) {
const { error_code, message, data, severity } = response.result;
switch (error_code) {
case "DEVICE_NO_MIC":
// マイクデバイスエラーの処理
break;
case "VALIDATION_MIC_THRESHOLD":
// バリデーションエラーの処理(元の値に戻す)
setValue(data);
break;
// ...
}
// 重要度に応じた表示
if (severity === "critical") {
showCriticalError(message);
}
}
```
## 移行作業の進め方
1. **パターンの確認**: 上記の変更パターンを参照
2. **エラーコードの特定**: `errors.py`から適切な`ErrorCode`を選択
3. **コードの置き換え**: 古いエラーハンドリングを新しいシステムに置き換え
4. **テスト**: エラーが正しく返されることを確認
5. **チェックリストの更新**: このドキュメントの✅を更新
## 注意事項
- すべてのエラーは`errors.py`に定義されたエラーコードを使用すること
- 新しいエラーが必要な場合は、まず`errors.py`に追加すること
- エラーメッセージは`ERROR_METADATA`で定義されたデフォルトメッセージを使用すること
- カスタムメッセージが必要な場合は`custom_message`パラメータを使用
- `data`パラメータには、エラー時にUIが元の値に戻せるように、元の値を渡すこと