2010-05-11 5 views
11

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

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

+1

Есть ли причина, по которой вы не можете просто прорваться в обработчик UnhandledException в App.xaml и проверить там Исключение? Я знаю, что это не идеальный, но он дает вам всю необходимую информацию. – Stephan

+1

Application.UnhandledException возникает после разворачивание стека. У вас есть доступ к трассировке стека, хранящейся в объекте исключения, но состояние локальных переменных во время броска теряется. –

+1

Я ожидаю, что [IntelliTrace] (http://social.msdn.microsoft.com/Forums/en/csharpide/thread/82f03aef-ada5-4c3c-a67d-8b66d99a835b) решит этот последний вопрос в будущем (SL 5?) версия. – hemp

ответ

5

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

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

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

+0

Спасибо за ответ. Я описываю это обходное решение в моем вопросе. Проблема заключается в том, что отладчик останавливает программу даже для исключений, которые будут обрабатываться где-то вниз по стеку вызовов. –

4

Ошибка производителя - это метод DispatcherOperation.Invoke(). Это выглядит следующим образом:

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

«поймать все» положение предотвращает отладчик наступали в Silverlight это нечто похожее на метод Формы Windows отсутствует.. И нет проверки, работает ли отладчик, что-то еще делает Winforms.

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

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

1

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

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

Это не идеально, но это так же отфильтровано, как и я.

9

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

Использование Application_UnhandledException event Вы можете программно inject a breakpoint.
 

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. 
     } 
    } 
} 
+0

Извините, я просто перечитал вопрос и понял, что вы уже списали этот подход, так как не отвечаете вашим потребностям. Я оставлю здесь ответ, так как кто-то может найти это полезным. – hemp

+0

+1 не знал о System.Diagnostics.Debugger.IsAttached – luvieere

0

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

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

Если это не ваш вопрос, просто игнорировать этот ответ.

0

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

Смежные вопросы