2013-06-24 33 views
0

我有一種方法可以創建一個Process對象,設置參數並對其進行明星處理。在下面的代碼中,哪種檢查錯誤的方法更正確? 這樣的:啓動後檢查進程對象錯誤

public void DoSomething(string command) 
    { 
     try 
     { 
      var p = new Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.FileName = command; 
      p.Start(); 
      p.WaitForExit(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 

或本:

public void DoSomething(string command) 
    { 
     Process p = new Process(); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.FileName = command; 
     p.Start(); 
     string error = p.StandardError.ReadToEnd(); 
     p.WaitForExit(); 

     if (!string.IsNullOrEmpty(error)) 
     { 
      Console.WriteLine(error); 
     } 
    } 

感謝您的幫助。

回答

0

讀取錯誤應該在退出後。你可以試試下面。

process.WaitForExit(); 

//Reading output and error 
string output = process.StandardOutput.ReadToEnd(); 
string strReturnValue = process.StandardError.ReadToEnd(); 
+0

確定嗎?我在[msdn庫](http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.process.standarderror(v = vs.90).aspx)中找到了此錯誤。如果發生死鎖父進程在p.StandardError.ReadToEnd之前調用p.WaitForExit並且子進程寫入足夠的文本來填充重定向的流 – Zabaa

1

我會建議第一種方法,但它不是一個很好的技術把代碼你所有線路在try塊。使用try塊僅適用於可能例外的行:

public void DoSomething(string command) 
    { 

     var p = new Process(); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = command; 
     try 
     { 
      p.Start(); 
      p.WaitForExit(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    }