fix(main): tRPC 境界で例外をログに残す - #2474
Merged
Merged
Conversation
procedure が投げた例外は trpc-electron 経由で renderer へ返るだけで、 main のログには 1 行も残らない。renderer 側は catch して 「エラーが発生しました。」を出すので、**UI にエラーが出ているのに ログが空**という状態になる。入力検証の失敗・窓の解決失敗・dataURL 未設定・ release 未検出はすべてこの経路で、いま何も記録されていない。 これは実運用に効いている。open な bug issue 14 件を調べたところ、5 件が 「たぶん直っているが報告者に聞かないと確認できない」で止まった。 その多くは Google フォーム経由の匿名報告で、ログが 1 枚あれば決着していた。 trpc-electron の createIPCHandler は onError を受け取らないため、境界に 置けるのは middleware だけ。procedure は 1 箇所からしか export しておらず (winProcedure / instProcedure / winInstProcedure はすべてこれ由来)、 ここに足せば全 procedure に効く。 next() は throw せず ok:false を返すので再 throw は不要。サービス層が 既に log.error している経路とは重複するが、そちらにはどの procedure の 失敗かが残らないので、path と type はここでしか出せない。
失敗したときだけ、どの procedure かが分かる形でログに出ることを見る。
This was referenced Aug 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
何が起きているか
procedure が投げた例外は、main のログに 1 行も残りません。
trpc-electronのcreateIPCHandlerは{ createContext, router, windows }しか受け取らず、onErrorがありません。例外は renderer へ返り、renderer 側はcatchして「エラーが発生しました。」を出します。結果として UI にエラーが出ているのにログが空という状態になります。この経路に乗っているもの:
api/*.tsの手書きバリデータが投げるTypeError)winProcedureのThe calling window was not found.)services/core.tsほか)なぜ今これを直すか
実運用に効いています。
open な bug issue 14 件を 1 件ずつ調べたところ、5 件が「たぶん直っているが、報告者に聞かないと確認できない」で止まりました(#1430 #1561 #1883 #2123 #2180)。多くは Google フォーム経由の匿名報告で、症状が「エラーの発生」「画面が点滅する」のように薄いものです。ログが 1 枚あれば決着していました。
その他タブにはバグ報告のボタンはあるのにログを開くボタンがありませんが、導線を付けても中身が空では意味がないので、まずこちらを塞ぎます。
この PR でやること
境界に置けるのは middleware だけなので、そこに 1 つ足します。
procedureは 1 箇所からしか export しておらず、winProcedure/instProcedure/winInstProcedureはすべてこれ由来なので(src/にt.procedureの直接使用はゼロ)、これだけで全 procedure に効きます。next()は throw せず{ ok: false, error }を返す(@trpc/server11.18.0 のMiddlewareResult)ので、再 throw は不要です。サービス層が既に
log.errorしている経路とは重複しますが、そちらには「どの procedure の失敗か」が残りません。pathとtypeはここでしか出せません。検証
src/main/api/trpc.test.tsを足しました。失敗時にどの procedure かが分かる形でログに出ること、成功時には何も出ないこと。middleware を外すと
expected "spy" to be called 1 times, but got 0 timesで落ちること、戻すと通ることを確認済みです。yarn lint/yarn lint:ts/yarn test(310 件)緑yarn package→yarn test:e2e(7 件)も回して緑この PR に入れていないもの
renderer 側に
} catch {で error オブジェクトを捨てている箇所が 13 あります(PackageActions.tsx5、monacoEditorRenderer.tsx3、ほか)。そちらは別 PR にします。