2016-08-18 11 views
1

Windowsアプリケーションで作業し、さまざまなexeを開き、SendKeysを使用して動作します。各EXEのtry catchを使用します。すべての例外メッセージはユーザーに郵送されます。このネストされたtryキャッチ内のすべての例外をキャッチして文字列に連結する

private void Form1_Load(object sender, EventArgs e) 
    { 
     Log("start"); 
    try{ 
     #region "Process1" 
     try 
     { 
      Log("Beginning Process1()"); 
      Process1(); 
      smtp("process 1 success"); 
      Log("Process1() completed"); 
     } 
     catch(Exception ex) 
     { 
      ExceptionLogFile(ex.Message, "Process1()", 27, "Form1.cs"); 
     } 
     #endregion 

     #region "Process2" 
     try 
     { 
      Log("Starting Process2"); 
      Process2(); 
      smtp("process 2 success"); 
      Log("Process2 completed"); 

     } 
     catch (Exception ex) 
     { 
      ExceptionLogFile(ex.Message, "Process2", 27, "Form1.cs"); 
     } 
     #endregion 

     #region "Process 3" 
     try 
     { 
      Log("Starting Process3"); 
      Process3(); 
      smtp("Process 3 success"); 
      Log("Process3 completed"); 

     } 
     catch (Exception ex) 
     { 
      ExceptionLogFile(ex.Message, "Process3", 61, "Form1.cs"); 
     } 
     #endregion 

     } 
    catch(Exception ex) 
    { 
     smtp(ex.Message); 
     } 
    } 

ような何か最後のcatchブロックは、基本的に私がトリガーされるメールの数を減らすことができるように捉え、すべての可能な例外を連結する必要があります。

P.S. smtp()は、メールを生成するために使用するメソッドです。渡されるパラメーターは、メール

public void Process1() 
    { 
     Process p = Process.Start("Process1"); 
     p.WaitForInputIdle(); 
     SetParent(p.MainWindowHandle, this.Handle); 
     IntPtr h = p.MainWindowHandle; 


     SendKeys.Send("{TAB}"); 
     SendKeys.SendWait("{Enter}"); 
    } 

タブのボディで、プロセス1の窓(のボタンを操作するために使用されている入力してください)

+0

問題?それぞれのcatchブロックで 'smtp(ex.Message)'を呼び出します。 –

+0

私は彼が 'StringBuilder'を作成し、各' catch'ブロックに例外とプロセス名からメッセージを追加するべきだと思います。最後に、彼はメッセージとして 'StringBuilder'の内容(もしあれば)をメールに送ります。プロセスが非同期で実行されている場合は、別のコードが必要になります。 – mortb

+0

各catchブロックで例外を再投入しない限り、最終的なcatchブロックは(smtp()呼び出しで)入力しません。しかし、例外を再現すると、複数の例外が発生することはありません。 –

答えて

0

どのようにこのようなものについて:何

private void Form1_Load(object sender, EventArgs e) 
{ 
    Log("start"); 
    var exceptionList = new List<string>(); 
    RunProcess(Process1, "Process1", 27, exceptionList); 
    RunProcess(Process2, "Process2", 27, exceptionList); 
    RunProcess(Process3, "Process3", 61, exceptionList); 

    smtp(string.Join(Environment.NewLine, exceptionList)); 
} 

private void RunProcess(Action processAction, string processName, int processValue, 
         ICollection<string> exceptions) 
{ 
    try 
    { 
     Log("Starting " + processName); 
     processAction.Invoke(); 
     smtp(processName + " success"); 
     Log(processName + " completed"); 
    } 
    catch (Exception e) 
    { 
     ExceptionLogFile(e.Message, processName, processValue, "Form1.cs"); 
     exceptions.Add(e.Message); 
    } 
} 
+0

process1()は単純な開始行ではなく、sendkeysを使用してプロセスを操作します。問題のコードを追加する。 –

+1

「シンプルなスタートライン」の意味を理解できません。 'Process1'、' Process2'などが実際のWindowsプロセス(つまり別のexe)である場合、それらの実行時例外はcatchブロックによって捕捉されません。プロセスを開始したときにスローされる例外だけが捕捉されます。 –

関連する問題