Skip to content

[CODE REVIEW] Empty catch block silently swallows errors + debug logs in production #3

Description

@stewroux

概要

深刻度: LOW

コード品質に関する2件の問題です。


問題1: 空の catch ブロック

該当箇所

App.tsxhandleStop 関数 (L192付近)

const handleStop = () => {
  sourceNodesRef.current.forEach(node => {
    try { node.stop(); } catch(e) {}  // ← エラーを無言で握りつぶし
  });

AudioBufferSourceNode.stop() は既に停止済みのノードに対して呼ぶと InvalidStateError をスローします。この実装では:

  • デバッグ時にエラーの存在に気づけない
  • 異常なノード状態が静かに継続する

修正方法

try { 
  node.stop(); 
} catch(e) {
  // Already stopped or not started — safe to ignore
}

または、ノードの状態チェックを追加:

sourceNodesRef.current.forEach(node => {
  try { node.stop(); } catch { /* already stopped */ }
});

少なくとも意図的なコメントを残すべきです。


問題2: デバッグ用 console.warn / console.error が本番コードに残留

該当箇所

App.tsx L82:

try { detectedM4aInfo = parseM4aHeader(arrayBuffer); } catch (e) { console.warn(e); }

App.tsx L106:

} catch (err) {
  console.error(err);   // ← 本番では不要
  setErrorMessage(t.decodeError);
}

App.tsx L231:

} catch (err) {
  console.error(err);   // ← 本番では不要
  setErrorMessage("AI Analysis Failed. Check API Key or Audio length.");
}

utils/geminiClient.ts L38:

} catch (error) {
  console.error("Gemini API Error:", error);   // ← 本番では不要
  throw error;
}

問題の詳細

  • ブラウザの DevTools Console にエラー詳細が表示される
  • ユーザーに内部実装の詳細(エラーメッセージ、スタックトレース)が漏洩する可能性がある
  • 本番環境では UI のエラーメッセージだけで十分

修正方法

開発環境でのみログを出力するよう条件分岐するか、Sentry などのエラーモニタリングサービスに切り替える:

// 開発環境のみログ出力
if (import.meta.env.DEV) {
  console.error(err);
}
setErrorMessage(t.decodeError);

このIssueは 2026-06-04 の日次自動コードレビューにより作成されました。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions