2016-08-18 2 views
1

다양한 exes를 열고 SendKeys를 사용하여 작동하는 Windows 응용 프로그램에서 작업합니다. 각 EXE에 try catch를 사용합니다. 모든 예외 메시지는 사용자에게 우편으로 발송됩니다. 이중첩 된 try catch의 모든 예외를 catch하고 문자열에 연결

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. 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}"); 
    } 

탭의 몸과

+0

무엇입니까 문제? 각 catch 블록에서'smtp (ex.Message)'를 호출하십시오. –

+0

나는 그가'StringBuilder'를 만들고 각각의'catch' 블록에 예외와 프로세스 이름으로부터 메시지를 추가해야한다고 생각합니다. 마지막에 그는'StringBuilder'의 내용 (있는 경우)을 메일로 보냅니다. 프로세스가 비동기를 실행하는 경우 다른 코드가 필요합니다. – mortb

+0

각 catch 블록에서 예외를 다시 발생시키지 않으면 마지막 catch 블록을 입력하지 않습니다 (smtp() 호출 사용). 그러나 예외를 다시 던지면 하나 이상의 예외가 발생하지 않습니다. –

답변

0

이런 식으로 뭔가에 대해 어떻게 Process1()의 창에 버튼을 조작하는 데 사용되는 입력 :

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 블록에 의해 어쨌든 잡히지 않습니다. 프로세스를 시작한 * 때 * 예외가 잡히게됩니다. –

관련 문제