错误处理使用进程c#
本文关键字:进程 处理 错误 | 更新日期: 2023-09-27 18:05:34
我使用c#创建了一个控制台应用程序,并使用Process
从另一个Windows窗体应用程序调用它。
static void Main(string[] args)
{
try
{
// ...my code
}
catch (Exception)
{
throw;
}
}
下面是使用进程
从窗口应用程序调用控制台应用程序的exe的代码 public void CallExe()
{
try
{
Process proc = new Process();
proc.StartInfo.FileName = @"D:'Debug'console1.exe";
proc.StartInfo.Arguments = "My args";
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();
string stdout = proc.StandardOutput.ReadToEnd();
string stderr = proc.StandardError.ReadToEnd();
proc = null;
}
catch (Exception ex)
{
throw ex;
}
}
现在,我想要的是当任何错误来自控制台应用程序它直接抛出我的窗口应用程序捕获块。或者我可以得到错误消息到我的窗口应用程序,这是由控制台应用程序抛出的?
您没有从您运行的进程中捕获任何内容。您不能在两个流上调用ReadToEnd
,因为它会阻止其中一个产生结果。如果您希望将标准输出捕获为标准错误,则需要订阅DataReceived事件并存储来自事件参数的数据。
windows窗体应用程序中的以下代码应该是这样的:
Process proc = new Process();
proc.StartInfo.FileName = @"console.exe";
proc.StartInfo.Arguments = "My args";
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//store outcome of process
var errors = new StringBuilder();
var output = new StringBuilder();
var hadErrors = false;
// raise events
proc.EnableRaisingEvents = true;
// capture normal output
proc.OutputDataReceived += (s, d) => {
output.Append(d.Data);
};
// Capture error output
proc.ErrorDataReceived += (s, d) => {
if (!hadErrors)
{
hadErrors = !String.IsNullOrEmpty(d.Data);
}
errors.Append(d.Data);
};
proc.Start();
// start listening on the stream
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
string stdout = output.ToString();
string stderr = errors.ToString();
if (proc.ExitCode !=0 || hadErrors)
{
MessageBox.Show("error:" + stderr);
}
在测试控制台应用程序中,您现在可以写入stderr并设置Exitcode,如果您喜欢:
try
{
Console.WriteLine("Ready ...");
var cmd = Console.ReadLine();
if (cmd == "e")
{
throw new Exception("boom");
} else
{
Console.WriteLine("success!");
}
Environment.ExitCode = 0;
}
catch(Exception e)
{
// write to stderr
Console.Error.WriteLine(e.Message);
// exit code to 1
Environment.ExitCode = 1;
}