問題タブ [computation-expression]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
f# - キャッチコンテキストから例外を再スローするときにスタックトレースを保持する方法は?
TL;DR: 元の例外のスタックトレースを保持しながら、以前にキャッチされた例外を後で発生させる方法。
Result
これはモナドや計算式で便利だと思うので、特に。そのパターンは、例外をスローせずにラップするためによく使用されるため、その例を次に示します。
そして今それを使用しましょう:
問題は、スタックトレースに例外のソース(ここではcalc
関数) が含まれないことです。書かれているとおりにコードを実行すると、次のようにスローされ、エラーの原因に関する情報は得られません。
使用reraise()
は機能しません。キャッチコンテキストが必要です。明らかに、次の種類の a は機能しますが、ネストされた例外のためにデバッグが難しくなり、このラップ-リレイズ-ラップ-リレイズ パターンがディープ スタックで複数回呼び出されると、かなり醜くなる可能性があります。
更新: TeaDrivenDev は、コメントで使用することを提案しましたExceptionDispatchInfo.Capture(ex).Throw()
。これは機能しますが、例外を別のものでラップする必要があり、モデルが複雑になります。ただし、スタックトレースは保持され、かなり実行可能なソリューションにすることができます。
.net - 単一ケース判別共用体を使用した計算式の作成
開始数を 2 回除算しようとする関数があるとします。ワークフロー全体がブール値を返す必要があります。
次のビルダーは正しいですか?