Как разбить необработанные исключения в Silverlight - PullRequest
11 голосов
/ 12 мая 2010

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

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

Ответы [ 7 ]

9 голосов
/ 20 мая 2010

Это довольно просто, на самом деле.

Используя событие 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.
        }
    }
}
5 голосов
/ 12 мая 2010

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

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

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

4 голосов
/ 19 мая 2010

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

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

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

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

Между тем, нет никаких других доступных опций, кроме Отладка + Исключения, поставьте галочку в поле Брошенный, чтобы принудительно остановить отладчик при возникновении исключения. Сохраните исключения, зарезервированные для действительно исключительных.

1 голос
/ 19 мая 2010

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

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

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

0 голосов
/ 18 января 2013

нажмите «Отладка», выберите исключения, отметьте как исключение общеязыковые среды выполнения. У меня была такая же проблема, и она исправила проблему для меня

0 голосов
/ 21 мая 2010

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

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

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

0 голосов
/ 19 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...