我正在研究两种不同的应用程序。
我在Application 1 Solution中调用Application 2进程(.exe文件)。当应用程序2抛出“无效的用户名和密码”错误时,我想在应用程序1解决方案中捕获该错误异常。
有没有办法在其他应用程序中的一个应用程序中捕获错误
我的应用程序是一个C#windows应用程序
答案 0 :(得分:1)
您不能在进程边界之间抛出catch。您必须使用进程间通信技术。根据您的具体情况,有很多可供选择。
以下是一些选项列表...
使用文件或命名管道可能是解决您尝试解决的问题的最简单方法。其他选项取决于您的环境和要求。
答案 1 :(得分:1)
有点......如果您实际上没有启动另一个流程,而是在现有流程中创建一个单独的AppDomain来运行您的可执行文件,那么您可以这样做。" inner"可执行文件也必须是CLR程序集。其他答案表明跨进程异常处理是不正确的。这种方法只能解决问题,同时希望能够为您提供后续行为。
刚开始这个过程通常不会得到你想要的东西。
var process = Process.Start("MyInnerProcess.exe");
您将获得一个Process对象,该对象为您提供有关该过程的各种丰富信息,并允许您监视正在写入标准输出流的内容......但无法真正访问过程中抛出的异常。< / p>
但是,如果您首先运行新的AppDomain以启动程序集,则可以非常轻松地接收该程序集在运行时抛出的所有异常(未处理和第一次机会!)的通知。 (注意:关于这些异常,您无能为力......但您会知道它们正在发生。)
以下是代码:
var innerDomain = AppDomain.CreateDomain("InnerDomain");
try
{
//Subscribe to the events you are interested in
innerDomain.UnhandledException += innerDomain_UnhandledException;
innerDomain.FirstChanceException += innerDomain_FirstChanceException;
//Execute your assembly within the app domain
innerDomain.ExecuteAssembly("MyInnerProcess.exe");
}
catch (Exception ex)
{
//Handle exceptions when attempting to launch the process itself.
}
void innerDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//Do something with the unhandled exceptions
}
void innerDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
//Do something with the first chance exceptions
}
现在,只要在其他进程中抛出异常,您就可以访问该异常。将为每个异常调用FirstChanceException处理程序(即使它在应用程序内部正确处理),因此您可能不想订阅它。您可能对UnhandledException事件最感兴趣。还要记住,所有未处理的异常将首先触发FirstChanceException(当它们被抛出时)然后触发UnhandledException,如果它们设法在没有被处理的情况下一直冒泡。
答案 2 :(得分:0)
添加到Jordan的解决方案中,您可以阅读Application2的控制台。
// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();