C#覆盖另一个函数中的try catch

C#覆盖另一个函数中的try catch,c#,error-handling,custom-error-handling,C#,Error Handling,Custom Error Handling,我正在使用一个从互联网上获得的dll,用于在C#中使用网络摄像头。如果找不到连接的网络摄像头,我希望显示“找不到要使用的摄像头。请确认此时没有其他应用程序正在使用您的摄像头,然后重试”。我遇到的问题是dll的创建者在他们的dll编程中包含了一个try-catch…所以我的try-catch-never-see是个例外,因为出现了一个“object referenced not set to a instance of a object”错误(由try/catch格式化为MessageBox)。是

我正在使用一个从互联网上获得的dll,用于在C#中使用网络摄像头。如果找不到连接的网络摄像头,我希望显示“找不到要使用的摄像头。请确认此时没有其他应用程序正在使用您的摄像头,然后重试”。我遇到的问题是dll的创建者在他们的dll编程中包含了一个try-catch…所以我的try-catch-never-see是个例外,因为出现了一个“object referenced not set to a instance of a object”错误(由try/catch格式化为MessageBox)。是否有一种方法可以在内置错误处理显示消息并显示我自己的错误处理之前覆盖它?

您不能仅覆盖try-catch块,但您可以覆盖该方法并基本上执行前一个方法正在执行的所有操作并删除try-catch块。

您不能仅覆盖try-catch块,但是您可以重写该方法,基本上执行前一个方法正在执行的所有操作,并删除try-catch块。

如果您得到的是“对象引用未设置为对象实例”(
NullReferenceException
),则很可能他们实际上没有捕获异常

如果您想抓住确切的情况(并让您不知道和无法处理的其他错误失败-进行异常处理的正确方法),您可以尝试使用异常中包含的堆栈信息:

class Program
{
    public static void DoSomething()
    {
        string blah = null;
        Console.WriteLine(blah.Length);
    }

    static void Main(string[] args)
    {
        try
        {
            DoSomething();
        }
        catch (NullReferenceException e)
        {
            string methodName = e.TargetSite.Name;
            Console.WriteLine(methodName);

            System.Diagnostics.StackTrace trace =
                new System.Diagnostics.StackTrace(e, true);

            int lineNumber = trace.GetFrame(0).GetFileLineNumber();
            Console.WriteLine(lineNumber);

            if(methodName == "DoSomething" && lineNumber == 13)
            {
                ShowErrorToUser(); // Todo: Implement this
            }
            else
            {
                throw; // Just re-throw the error if you don't know where it came from
            }
        }
    }
}
编辑

在评论中发现它确实被捕获,并显示在消息框中

我将留下这个答案,因为它适用于类似的情况,但不适用于这种情况。请参阅OscarMK的答案。

如果您得到的是“引用的对象未设置为对象的实例”(
NullReferenceException
),则很可能他们实际上没有捕获异常

如果您想抓住确切的情况(并让您不知道和无法处理的其他错误失败-进行异常处理的正确方法),您可以尝试使用异常中包含的堆栈信息:

class Program
{
    public static void DoSomething()
    {
        string blah = null;
        Console.WriteLine(blah.Length);
    }

    static void Main(string[] args)
    {
        try
        {
            DoSomething();
        }
        catch (NullReferenceException e)
        {
            string methodName = e.TargetSite.Name;
            Console.WriteLine(methodName);

            System.Diagnostics.StackTrace trace =
                new System.Diagnostics.StackTrace(e, true);

            int lineNumber = trace.GetFrame(0).GetFileLineNumber();
            Console.WriteLine(lineNumber);

            if(methodName == "DoSomething" && lineNumber == 13)
            {
                ShowErrorToUser(); // Todo: Implement this
            }
            else
            {
                throw; // Just re-throw the error if you don't know where it came from
            }
        }
    }
}
编辑

在评论中发现它确实被捕获,并显示在消息框中


我将留下这个答案,因为它适用于类似的情况,但不适用于这种情况。请参阅OscarMK的答案。

首先了解他们是如何测试网络摄像头的,然后调用他们的方法。。。除非您想知道如何自动化调试器。;-)比利,你从哪儿弄来的DLL?妈妈,我从网上买的!先弄清楚他们是如何测试网络摄像头的,然后调用他们的方法。。。除非您想知道如何自动化调试器。;-)比利,你从哪儿弄来的DLL?妈妈,我从网上买的!我尝试捕获一个NullReferenceException,但仍然得到相同的结果。我不确定我之前是否清楚这一点,但它出现在消息框中,所以我知道他正在使用catch来显示代码中发生的任何错误。我需要以某种方式覆盖它,但不知道如何处理,因为我的try/catch已经能够处理它了。这不是生死攸关的问题,但我想要一个更好的错误信息,有人可能真的能理解。@Brandon:不,不清楚:)你能编辑你的问题,让“对象引用…出现”改为“说一些关于消息框中显示的错误的信息吗?另外,如果代码许可没有问题,您可以尝试使用类似ILSpy的东西从DLL中删除代码。可以,我不知道该程序,我必须检查它。这是一个“开源”项目,因为它以这种方式发布在不同的开源网站上,只是他没有发布他的代码。他刚刚发布了他的C#项目文件源代码。@Brandon:只是让你知道要小心。顺便说一句,该程序也可以破解MS程序集,这在MSDN/其他文档让您失望时非常有用:)谢谢您的提示。我发现有问题的代码:://WebCam\u Capture.WebCam Capture private void timer1\u Tick(对象发送方,事件参数e){try{…}catch(异常值ex){MessageBox.Show(“捕获视频图像时出错。视频捕获现在将终止。\r\n\n”+ex.get\u Message();this.Stop();}}Timer1有一个私有作用域,我如何在不完全重新创建其dll的情况下重写_Tick方法?我专门尝试捕获一个NullReferenceException,但仍然得到相同的结果。我不确定我之前是否清楚这一点,但它出现在消息框中,所以我知道他正在使用catch来显示代码中发生的任何错误。我需要以某种方式覆盖它,但不知道如何处理,因为我的try/catch已经能够处理它了。这不是生死攸关的问题,但我想要一个更好的错误信息,有人可能真的能理解。@Brandon:不,不清楚:)你能编辑你的问题,让“对象引用…出现”改为“说一些关于消息框中显示的错误的信息吗?另外,如果代码许可没有问题,您可以尝试使用类似ILSpy的东西从DLL中删除代码。可以,我不知道该程序,我必须检查它。这是一个“开源”项目,因为它以这种方式发布在不同的开源网站上,只是他没有发布他的代码。他刚刚发布了他的C#项目文件源代码。@Brandon:只是让你知道要小心。顺便说一句,该程序也可以破解MS程序集,这在MSDN/其他文档让您失望时非常有用:)谢谢您的提示。我发现了有问题的代码:://WebCam\u Capture.WebCam Capture private void timer1\u Tick(对象发送方,事件参数e){try{…}catch(异常值ex){MessageBox.Show(“错误代码