有没有办法在其他应用程序中捕获一个应用程序中的错误

时间:2014-04-15 21:10:34

标签: c#

我正在研究两种不同的应用程序。

我在Application 1 Solution中调用Application 2进程(.exe文件)。当应用程序2抛出“无效的用户名和密码”错误时,我想在应用程序1解决方案中捕获该错误异常。

有没有办法在其他应用程序中的一个应用程序中捕获错误

我的应用程序是一个C#windows应用程序

3 个答案:

答案 0 :(得分:1)

您不能在进程边界之间抛出catch。您必须使用进程间通信技术。根据您的具体情况,有很多可供选择。

以下是一些选项列表...

  1. 文件:进程A写入进程B正在侦听的日志文件。很容易实现。
  2. 命名管道或TCP / IP套接字:您可以将两个进程与命名管道或套接字链接在一起,并通过线路将数据从一个应用程序传输到另一个应用程序。
  3. 消息队列:进程A可以侦听进程B正在将消息推送到的消息队列。
  4. 数据库:进程A可以在进程B检查数据库时写入数据库。这可以是一个远程数据库,也可以像SQLite数据库一样简单。
  5. 使用文件或命名管道可能是解决您尝试解决的问题的最简单方法。其他选项取决于您的环境和要求。

答案 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的控制台。

参考:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.110).aspx

// 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();