2011-03-15 4 views
0

В моем приложении WPF я использую LINQ to SQL, поэтому, когда я вызываю SubmitChanges(), он генерирует исключение, но я не могу его поймать.Как уловить SqlException в LINQ to SQL

Вот соответствующий код:

try 
{ 
    FeatureDataContext.Features.InsertOnSubmit(newFeature); 
    FeatureDataContext.SubmitChanges(); 
} 
catch (SqlException sqlEx) 
{ 
    System.Windows.MessageBox.Show("CreateNewFeature : " + sqlEx.Message); 
} 

И это исключение, которое выше броски:

Exception Info: System.Data.SqlClient.SqlException 
Stack: 
    at System.Data.Linq.DataContext.SubmitChanges(System.Data.Linq.ConflictMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 
    at [....] 

Как поймать SqlException в приложении WPF?

Я видел, что SubmitChanges() не является исключением. Но код, который поднял исключение указывает на код, который вызывает SubmitChanges().


EDIT:

Полное исключение заключается в следующем:

Application: CompositeApplicationLauncher.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.Data.SqlClient.SqlException 
Stack: 
    at System.Data.Linq.DataContext.SubmitChanges(System.Data.Linq.ConflictMode) 
    at System.Data.Linq.DataContext.SubmitChanges() 
    at Runaware.Wpf.CompositeApplication.SessionReviewer.SessionDataProvider.CreateNewCategory(Runaware.InsightAnalysis.ApplicationFeatures.ObjectModel.ApplicationInfo) 
    at Microsoft.Practices.Composite.Presentation.Commands.DelegateCommand`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Execute(System.__Canon) 
    at Microsoft.Practices.Composite.Presentation.Commands.DelegateCommand`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].System.Windows.Input.ICommand.Execute(System.Object) 
    at Runaware.Wpf.CompositeApplication.Commands.DelegateExecute.ExecuteCaller(System.Object, System.Windows.RoutedEventArgs) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(System.Object, System.Windows.RoutedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(System.Object, System.Windows.RoutedEventArgs, Boolean) 
    at System.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject, System.Windows.RoutedEventArgs) 
    at System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs) 
    at System.Windows.Controls.MenuItem.InvokeClickAfterRender(System.Object) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object) 
    at System.Threading.ExecutionContext.runTryCode(System.Object) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate) 
    at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame) 
    at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame) 
    at System.Windows.Threading.Dispatcher.Run() 
    at System.Windows.Application.RunDispatcher(System.Object) 
    at System.Windows.Application.RunInternal(System.Windows.Window) 
    at System.Windows.Application.Run(System.Windows.Window) 
    at System.Windows.Application.Run() 
    at Runware.Wpf.CompositeApplication.App.Main() 
+0

Не могли бы вы включить полную трассировку стека исключения? –

+0

@Pavlo: Done ... – Nawaz

ответ

1

Если Попробовать-задвижка блок Предоставленный внутри CreateNewCategory (смотрит на StackTrace) метод и тип исключаемого исключения является фактически SqlException, тогда его следует поймать.

В качестве альтернативы, если вы хотите поймать все исключения в приложениях, вам необходимо подписаться на событие Application.DispatcherUnhandledException для исключений в потоке пользовательского интерфейса и AppDomain.CurrentDomain.UnhandledException для исключений из других потоков.

+1

Следует отметить, что Application.DispatcherUnhandledException и AppDomain.CurrentDomain.UnhandledException должны использоваться только для регистрации ошибок и грамотно прекратить работу приложения. Не пытайтесь восстановить из исключения, используя эти события. – Phil