3

私は(私のベータ版の)アプリケーションを可能な限り実行し続けようとしています。そのため、重大なエラーが発生してアプリケーションが予期せずシャットダウンした場合に備えて、別のアプリケーションも内部に配置しましtry-catchた。アプリケーションは、何らかの理由で終了した後でも再開できます。 この特定のシナリオに対してそのような計画を立てるのは正しいですか? それが正しくない場合、プログラムを実行し続けるために他に何が推奨されますか?Program.cscatchApplication.Run()

これは、私が何を意味するかを示すサンプルコードです:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Hossein;
using Pishro.Classes;

namespace Pishro
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new frmMain());
            }
            catch(Exception exc)
            {
                API.SaveAndShowLog(exc);
                Application.Run(new frmMain());
            }
        }
    }
  }
4

3 に答える 3

6

例外をグローバルに処理することは、ロギングとアラートにとって良い考えです。

はい、あなたのような自動再起動ポリシーは役に立ちます。ただし、リスクがあります。クラッシュによってグローバル データ構造が破損した場合、アプリを再起動すると、サイレント データ破損などの予期しない結果が生じる可能性があります。たとえば、ファイルがまだ開いていてロックされている可能性があります。ロックが解除されていない可能性があります。静的変数が未定義の状態になっている可能性があります。アプリケーション UI が破棄されたことに気付かずに、不正なスレッドが実行されている可能性があります。

アプリケーションの新しいプロセスを開始して、アプリを再起動することをお勧めします。古いプロセスを死なせましょう。

于 2012-09-25T09:21:56.070 に答える
1

アプリケーションの実行メソッドをラップする代わりに、try catchイベントで例外を処理することを検討してください。

static void Main()
{
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
  MessageBox.Show("Exception handled");
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{

}

主にスレッド例外が必要ですが、理想的には、エラーをユーザーに記録/フラグ付けする何らかの形式を設定し、プログラムが不適切な状態で継続する可能性があるため、プログラムを破棄する必要があります。フォームとクリック イベントにボタンを配置するとthrow new Exception("");、メッセージ ボックスが表示されます。

于 2012-09-25T09:24:12.850 に答える
1

あなたの質問にはより深い質問が含まれていると思います..すべての例外をキャッチする必要がありますか? 続行するには、それらすべてをキャッチできます..しかし、予期しない、または知らない可能性のあるすべての例外は、おそらくバグです。

おそらく、アプリ内でより良いエラー処理アプローチを実装しようとする必要があります。したがって、すべての例外は既知または予想されます。

于 2012-09-25T09:20:58.830 に答える