0

重複の可能性:
StackOverflowException を防止および/または処理するにはどうすればよいですか? (C#)
C# はスタック オーバーフロー例外をキャッチします

C# (.NET 2.0 を使用) で記述されたかなり複雑なアプリケーションがあります。プログラムは大量のファイルを非常に再帰的に処理し、一部のクライアントではスタック オーバーフロー例外が発生します。プログラムは非常に複雑で、問題が発生したクライアントでさえ、問題を再現することさえできませんでした。

明らかな解決策は、スタック オーバーフローの原因となっているコードを修正することですが、その可能性は低いと思われます。コード ベースは 200 万行をはるかに超えるコードであり、メモリ内に大規模な再帰的データ構造を作成します。問題の部分に出くわすことはまずありません。(とにかく、短期的にではありません。)

ただし、私たちのプログラムはファイルをバックアップし、処理中のファイルに変更を加え、例外が発生した場合はすべてを元の状態に復元します。スタック オーバーフローの例外が発生すると、プロセスが終了するだけで、スタック オーバーフローをキャッチできないため、この復元機能を実行する機会がありません。

私の質問は次のとおりです。.NET 2.0 でスタック オーバーフロー例外をキャッチする方法はありますか。CLR をホストできません。例外は真のスタック オーバーフローであり、コードによってスローされたものではありません。これができれば、少なくとも、プログラムが終了する前に行った変更を元に戻すことができます。

編集:スタックオーバーフロー例外とは何か、そしてそれがどれほど深刻であるかをよく知っていることに注意してください。私はそれを見つけるためのアドバイスを求めているわけではありません - このような状況はめったに起こりません. 私がやろうとしているのは、ディスク容量が限られている環境でクライアント データを復元することです。復元操作の後にプログラムが停止した場合でも、それで問題ありません。

4

2 に答える 2

0

あなたが言っているように聞こえますが、ファイルを変更するプロセスがあり、エラーが発生した場合はファイルを復元する必要がありますが、それを行っていません。

それが同じである場合、一時ファイルを使用しないでください。操作が完了したら、一時ファイルでソース ファイルを上書きします。キャッチされない例外が発生した場合、元のファイルは変更されていません (書き込みに関して)。

于 2012-10-01T21:05:59.613 に答える
0

これはお勧めしませんが、/F Compiler Switchを使用してコンパイル タイルでスタック サイズを設定できます。デフォルトは 1MB です。これはコードを「修正」する良い方法ではありませんが、これらの厄介なStack Overflowメッセージを防ぐことができます。

于 2012-10-01T21:23:54.460 に答える