Как отловить SqlException в LINQ to SQL - PullRequest
0 голосов
/ 15 марта 2011

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

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

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().


РЕДАКТИРОВАТЬ:

Полное исключение это:

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()

1 Ответ

1 голос
/ 15 марта 2011

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

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

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