C # break отладчик на исключение как «Break When Thrown» - PullRequest
0 голосов
/ 12 июня 2018

В моем приложении asp.net, если приложение выдает исключение, оно перехватывается и обрабатывается 500 страниц.Я хотел бы сломать отладчик на месте броска.В настоящее время я использую следующий фрагмент кода:

           void ExceptionHandler(Exception ex) {
                if (Debugger.IsAttached)
                {
                    Debugger.Break();
                }}

Однако этот код прерывается на ExceptionHandler, а не на месте броска.Как я могу разорвать в месте выброса?

Я не хочу изменять настройки исключений, потому что я хочу разбивать на исключения, которые достигли ExceptionHandler, а не на исключения, восстановленные системой.

Чтобы лучше проиллюстрировать мою проблему:

class Server // Server owned by third party
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException += (source, e) =>
        {
            // This does not help, because there are legit exceptions
            Console.WriteLine("FirstChanceException event raised in {0}: \"{1}\"",
                AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
        };
        AppDomain.CurrentDomain.UnhandledException += (source, e) =>
        {
            // This does not help, because exception should be handled by server, otherwise it would shut down
            Console.WriteLine("UnhandledException event raised in {0}: \"{1}\"",
                AppDomain.CurrentDomain.FriendlyName, e.ExceptionObject);
        };

        var app = new Application();
        while (true)
        {
            try
            {
                app.ProcessRequest();
            }
            catch (Exception e)
            {
                // If we get here this mean that something is wrong with application
                // Let's break on line marked as #1
                Console.WriteLine("Server swallowed an exception \"{0}\"", e.Message);
                Debugger.Break(); // Debugger breaks, but no exception dialog, and stack trace in method main
            }
        }
    }
}

class Application
{
    public void ProcessRequest()
    {
        try
        {
            Console.WriteLine("Doing stuff");
            throw new InvalidOperationException("Legit exception handled by application");
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine("Application handled exception \"{0}\"", ex.Message);
        }

        throw new InvalidOperationException("Unhandled exception"); // #1. Something is wrong here
    }
}

Вывод программы:

Doing stuff
FirstChanceException event raised in ExceptionTest: "Legit exception handled by application"
Application handled exception "Legit exception handled by application"
FirstChanceException event raised in ExceptionTest: "Unhandled exception"
Server swallowed an exception "Unhandled exception"

Ответы [ 2 ]

0 голосов
/ 19 июня 2018

Это называется обработчиком исключений первого шанса.Вот пример:

static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException +=
        (object source, FirstChanceExceptionEventArgs e) =>
        {
            Console.WriteLine("FirstChanceException event raised in {0}: {1}",
                AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
        };

        try
        {
            Console.WriteLine("Doing stuff");
            throw new ArgumentNullException("Super awesome exception");
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught an exception {0}", e.Message);
        }
    }

Или посмотрите это в документах msdn: https://docs.microsoft.com/en-us/dotnet/framework/app-domains/how-to-receive-first-chance-exception-notifications

В стеке вызовов при возникновении исключения первого шанса будет показано «throw» в качестве предыдущего местоположения наcallstack.

Обновление:

Исключения второго шанса не обрабатываются во время «броска».Это по определению.У трассировки стека есть местоположение броска.

Так что вы можете либо - разбить при первом шансе и игнорировать исключения, которые вам не нужны (просто перебросить их) - разбить при исключениях второго шанса и проверить трассировку стека, чтобы определить, откуда они пришли

Вы не можете разбить «бросок» с помощью второго шанса.Это не так, как они работают.

0 голосов
/ 12 июня 2018

Вы можете подключить отладчик Visual Studio (или удаленный отладчик, если он работает на отдельном компьютере).

Шаг 1. Настройка параметров в среде IDE Visual Studio.

Из менювыберите «Отладка»> «Windows»> «Настройки исключений».

Если вы выберете все исключения, это приведет к тому, что отладчик будет прерывать перед каждым исключением (обработанным и необработанным), пока вы подключены к работающемуprocess.

Шаг 2. Присоединитесь к процессу, чтобы отладить его в Visual Studio (локальном или удаленном).

В строке меню выберите «Отладка»> «Присоединить к процессу ...» и найдите свойприложение или пул веб-приложений по идентификатору процесса.

(Примечание. Если вы выполняете удаленную отладку, скопируйте удаленный отладчик из установочного каталога Visual Studio на удаленный компьютер и запустите его с правами администратора, чтобы Visual Studio мог подключитьсяОбычно по умолчанию используется порт 4020.)

...