在多个例程之间使用try-catch

时间:2011-07-10 14:35:42

标签: c# error-handling try-catch system.reflection

这有点是我之前提出的问题的后续问题,虽然我现在能够提供更多代码来改善我的问题,并进一步显示我在这方面遇到的麻烦。

我这里有三个例程。其中两个例程一起工作 - 如果成功,将使用System.Reflection将程序集加载到内存中。如果文件没有正确加载到内存中,我希望这些例程返回错误,但由于某些原因,这些try-catch语句根本不会按照我想要的方式工作。

注意:要使此例程起作用,文件必须是.net程序集。例如,如果文件是在VB6中编程的,则会抛出错误。这是我试图回复给我的错误。

private void ExecuteDataIntoMemory(string filePath)
{

    byte[] bytes = File.ReadAllBytes(filePath);

    try
    {
        ExecFile(bytes);
        MessageBox.Show("successfully loaded this file into memory");
    }

    catch
    {
        MessageBox.Show("Could not load this file into memory");
    }

}

private static void ExecFile(byte[] data)
{
    try
    {
        //Work around for "SetCompatibleTextRenderingDefault"  
        System.Threading.Thread T = new System.Threading.Thread(ExecFile);
        //Set STA to support drag/drop and dialogs?
        T.SetApartmentState(System.Threading.ApartmentState.STA);
        T.Start(data);
    }

    catch
    {
        MessageBox.Show("caught some error ...");
    }

}
private static void ExecFile(object o)
{

        System.Reflection.MethodInfo T = System.Reflection.Assembly.Load((byte[])o).EntryPoint;
        if (T.GetParameters().Length == 1)
            T.Invoke(null, new object[] { new string[] { } });
        else
            T.Invoke(null, null);


}

如果有必要,我可以澄清更多信息,但我不确定此时还包括哪些其他信息。

5 个答案:

答案 0 :(得分:1)

在ExecFile的catch语句中使用“throw”语句来引发ExecFile中捕获的相同“异常”(或错误)。例如:

 catch {
      throw;
 }

我想我发现了问题。 ExecFile(byte [])启动线程并立即返回,而不等待线程退出。要允许该方法等待线程退出,请添加:

 T.Join();

在启动线程后立即执行。 (为了避免可能的歧义,你应该重命名ExecFile(object)。我也不确定ExecFile(byte [])是否会从ExecFile(object)中捕获异常。)

答案 1 :(得分:0)

如果你在ExecFile(byte[] data)中捕获异常,它将不会在你的父方法(ExecuteDataIntoMemory(string filePath))中传播,然后不再被捕获

如果您确实需要捕获两次异常,请以这种方式重写您的子方法

private static void ExecFile(byte[] data)
{
    try
    {
        //Work around for "SetCompatibleTextRenderingDefault"  
        System.Threading.Thread T = new System.Threading.Thread(ExecFile);
        //Set STA to support drag/drop and dialogs?
        T.SetApartmentState(System.Threading.ApartmentState.STA);
        T.Start(data);
    }

    catch (Exception ex)
    {
        MessageBox.Show("caught some error ...");
        throw ex;
    }
}

如果没有,那么这个方法中的错误就不会try..catch,并且会传播异常。

答案 2 :(得分:0)

如果我理解你,那么只有ExecuteDataIntoMemory成功才能评估ExecFile

1-您正在运行一个新线程来执行将在不同线程中执行的ExecFile方法。因此,首先在try ExecFile(byte[] data)块中运行ExecFile(data)而不使用新线程,因为您想以任何方式等待它:

try
{
    ExecFile(data);
}

2-请注意,您有两个具有相同名称的方法'ExecFile(byte [] data)'和ExecFile(object o)您传递的数据来自类型byte[],因此它将是无限递归或直到堆栈溢出异常被提出。所以你应该将data转换为object,然后将其传递给方法,即:

try
{
    ExecFile((object)data);
}

3-在ExecFile(byte [] data)方法的catch块中重新抛出异常,以便可以从调用方法2中处理它,即:

try
{
    ExecFile((object)data);
}
catch
{
    MessageBox.Show("caught some error ...");
    throw;
}

答案 3 :(得分:0)

只需查看callstack哪个方法再次调用ExecuteDataIntoMemory方法?

如果您使用Visual Studio IDE,请在消息框中添加断点:

   MessageBox.Show("successfully loaded this file into memory");

然后简单转到视图菜单,从那里找到要显示的callstack窗口并查看callstack(向callstack显示外部代码)

也许这可能会有所帮助。

答案 4 :(得分:0)

  1. 粗略的方式(我认为),但应该适用于您的情况,订阅

    AppDomain.CurrentDomain.UnhandledException

  2. 事件已发生变化,它将直接从函数ExecFile(object o);

    中获取异常
    1. 或者创建一个状态机,如果ExecFile(object o);方法出现任何异常,则设置为NEGATIVE状态。

    2. 或者只是不要在多线程中执行:)