C # Переопределить try-catch в другой функции - PullRequest
0 голосов
/ 25 июня 2011

Я использую DLL, которую я получил из Интернета, для использования веб-камеры в C #. Если не удается найти подключенную веб-камеру, я хотел бы отобразить что-то вроде «Невозможно найти камеру для использования. Пожалуйста, убедитесь, что никакие другие приложения не используют вашу камеру в настоящее время и попробуйте снова». Проблема, с которой я столкнулся, заключается в том, что создатель dll включил try-catch в свои dll-программы ... поэтому мой try-catch никогда не видит исключения, потому что вместо этого возникает ошибка «объект, на который не установлен экземпляр объекта» (отформатирован попыткой / перехватом в MessageBox). Есть ли способ, которым я могу переопределить встроенную обработку ошибок, прежде чем она отобразит сообщение и отобразит мою собственную?

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Если вы получаете "объект, на который ссылаются, не установлен в качестве экземпляра объекта" (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
            }
        }
    }
}

Редактировать

В комментариях обнаружил, что он действительно перехватывается и отображается в окне сообщения.

Я оставлю этот ответ, так какэто применимо к аналогичной ситуации, но не применимо к этой ситуации.Вместо этого смотрите ответ ОскарМК.

1 голос
/ 25 июня 2011

Вы не можете переопределить только блок try-catch, но вы можете переопределить метод и в основном сделать все, что делает предыдущий метод, и удалить блок try-catch.

...