Как разбить необработанные исключения в Silverlight

В консольных приложениях .Net отладчик разрывается в точке броска (перед отключением стека) для исключений без соответствующего блока catch. Кажется, что Silverlight запускает весь код пользователя внутри try catch, поэтому отладчик никогда не ломается. Вместо этого возникает Application.UnhandledException, но после обнаружения исключения и разворачивания стека. Чтобы ломаться, когда необработанные исключения выбрасываются и не попадают, я должен включить первые исключения исключений, которые также останавливают программу для обработанных исключений.

Есть ли способ удалить блок Silverlight try, чтобы исключения попадали непосредственно в отладчик?

Ответ 1

На самом деле это довольно просто.

Используя Application_UnhandledException событие, вы можете программно ввести Точка останова
 .

using System.IO; // FileNotFoundException
using System.Windows; // Application, StartupEventArgs, ApplicationUnhandledExceptionEventArgs

namespace SilverlightApplication
{
    public partial class App : Application
    {
        public App()
        {
            this.Startup += this.Application_Startup;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new Page();
        }

        private void Application_UnhandledException(object sender, 
            ApplicationUnhandledExceptionEventArgs e)
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                // Break in the debugger
                System.Diagnostics.Debugger.Break();

                // Recover from the error
                e.Handled = true;
                return;
            }

            // Allow the Silverlight plug-in to detect and process the exception.
        }
    }
}

Ответ 2

В своем веб-проекте убедитесь, что установлен флажок "Отладка приложений Silverlight". Вы найдете настройки на вкладке Свойства → Веб веб-приложения.

В VS2008 нажмите Ctrl + Alt + E, чтобы открыть окно "Исключения", поставьте флажок в столбце "Бросок" для "Исключения общего времени выполнения языка". В VS2010 я не верю, что ярлык работает, поэтому вам нужно перейти в "Отладка- > Исключения" из выпадающего меню.

Я не уверен, что это именно то, что вы ищете, но, надеюсь, это помогает!

Ответ 3

Создателем проблемы является метод DispatcherOperation.Invoke(). Это выглядит так:

internal void Invoke()
{
    try
    {
        this._operation.DynamicInvoke(this._args);
    }
    catch (Exception exception)
    {
        Error.GetXresultForUserException(exception);
    }
}

Предложение "уловить все" предотвращает вмешательство отладчика. В Silverlight отсутствует что-то похожее на Windows Forms Application.SetUnhandledExceptionMode() метод. И там нет проверки, работает ли отладчик, что-то еще делает Winforms.

Это не очень сложно добавить, я бы рекомендовал вам опубликовать запрос функции на сайте connect.microsoft.com

Между тем, нет другой доступной опции, кроме Debug + Exceptions, установите флажок "Бросок", чтобы заставить отладчик остановиться, когда генерируется исключение. Храните исключения, зарезервированные для действительно исключительных.

Ответ 4

Я использую метод CTRL + ALT + E (отладкa > Исключения), чтобы заставить отладчика ломаться при броске, но я делаю это по мере необходимости и как можно более целенаправленно.

Если я пытаюсь отследить исключение, я буду искать его в окне вывода [Отладка] после первого сбоя приложения. Затем я включу "break when throw" для этого типа исключения только с помощью кнопки "Найти" в правой части диалогового окна.

Он не идеален, но он отфильтрован, как я его получил.

Ответ 6

Не каждый браузер поддерживает отладку Silverlight.

Например, я не мог отлаживать его с помощью Firefox или Chrome, он работал только в IE.: (

Если это не ваша проблема, просто проигнорируйте этот ответ.

Ответ 7

нажмите "Отладка", выберите "Исключения", отметьте исключения для исполняемого файла в общем языке. У меня была та же проблема, и я исправил эту проблему для меня.