エラーハンドリングとリトライ機能
エラー1: NotReadableError(デバイスが使用中)
他のアプリケーションがカメラを使用している場合に発生します。最大3回までリトライします。
解決方法: リトライ機能
リトライ回数をカウントし、待機時間を段階的に増やしながら再試行します。
const maxRetries = 3;
const retryDelay = 500; // ミリ秒
if (error.name === 'NotReadableError') {
if (retryCount < maxRetries) {
await new Promise(resolve =>
setTimeout(resolve, retryDelay * (retryCount + 1))
);
return await startCamera(deviceId, retryCount + 1);
}
}
エラー2: NotAllowedError(アクセス許可が必要)
ユーザーがカメラへのアクセスを許可していない場合に発生します。
解決方法: 適切なエラーメッセージ
ブラウザの設定を確認するよう、ユーザーに分かりやすいメッセージを表示します。
if (error.name === 'NotAllowedError') {
errorMessage = 'カメラのアクセス許可が必要です。
ブラウザの設定を確認してください';
}
エラー3: NotFoundError(カメラが見つからない)
指定したカメラデバイスが見つからない場合に発生します。
解決方法: デバイスIDの検証
カメラリストから選択されたデバイスIDが有効かどうかを事前に確認します。
const cameras = await getCameras();
const cameraExists = cameras.some(
cam => cam.deviceId === deviceId
);
if (!cameraExists) {
errorMessage = 'カメラが見つかりません';
}
エラー4: OverconstrainedError(設定が対応していない)
指定した解像度やフレームレートがカメラで対応していない場合に発生します。
解決方法: ideal制約の使用
`exact`ではなく`ideal`を使用することで、利用可能な設定に自動的に調整されます。
const constraints = {
video: {
width: { ideal: 640 }, // exactではなくideal
height: { ideal: 480 },
deviceId: { exact: deviceId } // デバイスIDのみexact
}
};
エラーハンドリングの原則: エラータイプに応じた適切なメッセージを表示し、リトライ可能な場合は自動的に再試行します。ユーザーにとって分かりやすく、開発者にとってデバッグしやすいメッセージを心がけました。