3

デスクトップから .exe を実行するだけで実行したい C# のアプリケーションがあります。ただし、プログラムをクラッシュさせる何らかのエラーが発生することは間違いありません。ユーザーがプログラムを使用しているときに問題の原因を確認できるように、プログラムがクラッシュする原因となった問題をテキスト ファイルに書き込む方法はありますか? これを行うためにデバッグ モードを使用できることはわかっていますが、アプリケーションを VS 内ではなくスタンドアロンとして実行したいと考えています。

ありがとう、

私は try catch ブロックを認識しており、問題が発生する可能性のあるブロックを既に使用しています。しかし、私は一般的に話しています。たとえば、どこで問題が発生するかわからなかったとします。この特定のエラーをファイルに出力する方法はありません。

4

6 に答える 6

2

バックグラウンド スレッドで例外が発生した場合はキャッチされないことを除いて、グローバルな try/catch メソッドを試すことができます。アプリドメイン ( msdnAppDomain.UnhandledException )で未処理の例外を通知する場合に使用できます。プログラムの残りの部分が次のように実行される前に、メインでサインアップします。

static void Main(string[] args)
{
  AppDomain.UnhandledException += WriteUnhandledExceptionToFile;

  // rest of program
}

static void WriteUnhandledExceptionToFile(object sender, UnhandledExceptionEventArgs args)
{
   // write to where ever you can get it.
   string path = Path.Combine(Environment.CurrentDirectory, "UnhandledException.txt");
   File.WriteAllText(path, args.ExceptionObject.ToString()); // will print message and full stack trace.
}

編集

既定では、Windows フォームと WPF は、UI スレッドでスローされたすべての例外をキャッチすることに注意してください。これらのスレッドで例外が通知されるようにするには、Application.ThreadException イベント (フォーム) または Application.DispatcherUnhandledException イベント (wpf) にサブスクライブする必要があります。このコードは、上記の AppDomain イベントのコードと非常によく似ています。

于 2012-05-21T20:40:40.090 に答える
0

ここで初期情報を参照してくださいhttp://www.csharp-examples.net/catching-unhandled-exceptions/

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
}

UnhandledExceptionイベントは、メインUIスレッドからスローされたキャッチされなかった例外を処理します。ThreadExceptionイベントは、UI以外のスレッドからスローされたキャッチされない例外を処理します。

MessageBoxを実際のロギング(log4netなど)に置き換えます。これにより、分散アプリケーション用の別のサーバー、ローカルユーザー用のファイルシステム、イベントログにエラーをログアウトする機能が提供されます。時間に余裕がある場合は、オプションはかなり無制限です。

于 2012-05-21T20:34:11.410 に答える
0

例外の詳細をファイルに書き込むグローバル例外ハンドラーを用意します。

Mainメソッドのコードをブロックでラップするとtry{}catch{}、例外の詳細をブロックに書き出すことができますcatch

try
{
  // Calls to application code
}
catch(Exception ex)
{
   // log `ex.ToString()`
   throw; // rethrow to ensure termination optionally: `Application.Exit`
}
于 2012-05-21T20:26:47.473 に答える
0

開始メソッドの 1 つを try catch ブロックで囲むことができます

try
{
   ///Your code
}
catch(Exception exception)
{
   System.IO.File.WriteAllLines("ErrLog.txt", exception.Message);
}

永続的な解決策として、拡張メソッド ToLog を作成し、必要なときにいつでも使用できます。

public static void ToLog(this Exception Exception)
{
        using (var file = File.AppendText("ErrorLog.txt"))
        {
           file.WriteLine(DateTime.Now + " : " + exception.Message);
        }
}

このようにcatchブロックで使用できます

 catch(Exception exception)
 {
    exception.ToLog();
 }
于 2012-05-21T20:27:06.300 に答える
0

問題をログに記録していない場合でも、通常、ウィンドウ内のイベント ビューアから問題のエラーを取得できます。

于 2012-05-21T20:27:10.123 に答える
0

最初に確認したいのは、C#try/catchコンストラクトです。これはおそらく、エラー処理の最初のビルディング ブロックです。

エラーをどのように処理するかについては、完全にあなた次第です。現在、あなたの唯一の目標は、それらをファイルに記録することです。Exceptionキャッチしたオブジェクトから多くの詳細を取得し、それらの詳細をファイルに書き込むことができます。さらに、ロギング ライブラリを使用して、そのようなことを支援できます。

適切なエラー処理は、本当に大きなテーマです。心に留めておくべきことの 1 つは、例外をキャッチする論理的な場所です。理想的には、あなたはそれを扱うことができる場所でそれをキャッチしたいと考えています. つまり、コードがエラーから十分に回復できる場所です。それが致命的なエラーであり、アプリケーションが完全に停止する必要がある場合はthrow、例外をスタックのさらに上に置いて、未処理のままにしておくことができます (キャッチした場所にはまだログが記録されます)。

ただし、エラーをログに記録して先に進むことができる論理的な状態にある場合は、catchブロックを使用してそれを行うことができます。詳細をログに記録し、更新が必要なオブジェクト/データの状態を更新して、アプリケーションのフローを続行します。

于 2012-05-21T20:28:51.243 に答える