2016-12-14 6 views
3

すべてのスレッドはプライベートスタックを所有しているので、別のスレッドにStackoverflowExceptionについて通知しないでください。特にスレッドがバックグラウンドワーカースレッドの場合はどうしたらいいですか?なぜStackoverflowExceptionは単なるスレッドではなく、プロセス全体を終了させるのですか?

+0

どのスレッドに通知したいと思いますか? StackOverflowExceptionに直面して、信頼できる例外ハンドラを書くのは本当に難しいので、これはあらかじめ登録されたフォワーダの形である種の魔法を必要とします。これは興味深い機能ですが、すべての機能は設計、実装、文書化のコストを正当化する必要があります。これはおそらくないでしょう。とにかく、スタックオーバーフローが無限の再帰のような無害のミスに起因する場合、おそらくそれを妨げる可能性があります。 –

+0

[CLRホストは(https://msdn.microsoft.com/en-us/library/ms164395(v = vs.110).aspx)自動ではありません。あなたはFAIL_StackOverflowをmehに変える多くのものを見つけるつもりはありません。まあ、うまくいけない。 .NET 1.xで多すぎるのは、OSがWindows.NETではなくVistaと呼ばれる基本的な理由です。たぶん、それは良いことでした、その人気を与えて:) –

答えて

3

すべての例外は、キャッチされずにルートに戻る場合、プロセスを解体します。 StackOverflowException(.NET 2.0以降)に捕捉できません。したがって、ブーム。

基本的にStackOverflowExceptionは発生しません。たとえば、反復コードにカウンタを追加するか、非再帰的な実装を使用して再書き込みします(おそらく、保留中のアイテムのQueue<T>またはStack<T>上のループ)。

+0

"基本的には、StackOverflowExceptionを引き起こしません"。それは間違いないが、今日のソフトウェアは数十から数百(NuGet)のパッケージで構成されており、それらのすべてを制御することはできない。私の場合、EntityFrameworkは、それを再現する機会がなくても時々狂っているようです.VSで一回見たことのあるコールスタックは長くても(〜50)でした。この例外が発生しなかった場合にデバッガ(VS 2015)を接続すると、デバッグセッション+プロセスがただちに接続され、ただちに終了します。 – springy76

+0

@ springy76: 'AppDomain.UnhandledException'と[' HandleProcessCorruptedStateExceptions'](https://msdn.microsoft.com/library/system.runtime.exceptionservices.handleprocesscorruptedstateexceptionsattribute)を使って、ブレークポイントできるハンドラを設定することができます。 (これによりプロセスが終了するのを妨げることはありませんが、そのような方法でデバッグすることはさらに多くなるでしょう) –

+1

完全性のために、このような例外をスローする可能性のあるコードを絶対に*実行しなければならない* CLRを自分でホストし、['ICLRPolicyManager :: SetActionOnFailure'](https://msdn.microsoft.com/library/ms164395)でカスタムポリシーを適用してAppDomainをアンロードするだけです。私はあなたがそれを遠くに行きたいとは思っていません、それは少しの利益のための仕事のトンですが、私はまだそこにそれを投げています。実際には、それ自体のプロセスでこのようなコードを分離すると、クラッシュする可能性があります。 –

関連する問題