ThinkGeo.com    |     Documentation    |     Premium Support

How trap exception

I'm getting the following exception reported by my users. They say it happens when they are interacting with the map. Is there any way to trap this error? A map exception event? WPF v5.5


 



Object reference not set to an instance of an object.
at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.<>c__DisplayClass2.<DrawException>b__0()
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.Show()
   at System.Windows.Window.ShowDialog()
   at Caliburn.Micro.WindowManager.ShowDialog(Object rootModel, Object context, IDictionary`2 settings)
   at KernMobile.Windows.Helpers.DialogHelper.ShowWindow(Screen viewModel)


Hello Steve, 
  
 Exception “Object reference not set to an instance of an object” is a c# exception, not thrown by our control, it’s really hard to say what’s the root cause if we can’t recreate it, is that possible you can provide a sample to us? 
  
 Also you can try to upgrade to 6.0, it fixed a lot of bugs and has better performance. 
  
 Regards, 
  
 Gary

 Hi Gary


I'm not after the root cause. What I'm after is a way of catching and handling exceptions inside the map control. 


This is happening on customer hardware and I can't replicate. 


Where can I trap exceptions in the map control?


Here is where the exception is thrown:




ThinkGeo.MapSuite.WpfDesktopEdition.Tile.<>c__DisplayClass2.<DrawException>b__0()

How can I catch this?


Cheers


Steve


 









Hello Steve, 
  
 Sorry for my misunderstanding, if you only want to catch the exception not track it, you can set: 
  
 Layer.DrawingExceptionMode = DrawingExceptionMode.DrawException; 
  
 on the problem layer, then the tile will keep drawing but the problem one will be the pink. 
  
 Regards, 
  
 Gary

Hi Gary 
  
 Thanks but that means that the map swallows the exception. I need to be able to catch it so I can inform the user there has been a problem and log the issue. 
  
 How can I catch the exception? 
  
 Cheers 
  
 Steve

Hello Steve, 
  
 I think you can simply use try catch fit this requirements, what’s the problem have you met when you using try catch? 
  
 Regards, 
  
 Gary

Yes but where? In what map event?

 Hello Steve,


 
Any place that you think will cause this problem, even you can catch the whole map load, it won't effect the performance a lot. like:

private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                Map1.MapUnit = GeographyUnit.DecimalDegree;
                Map1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);
                WorldMapKitWmsWpfOverlay worldOverlay = new WorldMapKitWmsWpfOverlay();
                Map1.Overlays.Add("WMK", worldOverlay);
                Map1.Refresh();
                Map1.TrackOverlay = new OwnTrackOverlay();
                Map1.TrackOverlay.TrackMode = TrackMode.Freehand;
                Map1.CurrentExtentChanged += new System.EventHandler<CurrentExtentChangedWpfMapEventArgs>(Map1_CurrentExtentChanged);
            }
            catch (Exception exception)
            { 
            }
        }

Regards,
 
Gary

It’s not during the map load that the problem happens. 
  
 If I have my map set to hybrid tile mode, on slower laptops the user can click on the map before the map has finished drawing. This thows an exception. I would like to catch the exception. 
  
 I have a workaround which involves setting the tile mode to single. This does not allow the user to click before the map has finished drawing. However I would like to capture the error and allow the user to use hybrid mode. 
  
 Cheers 
  
 Steve

Hello Steve, 
  
 I see, so you mentioned hybird tile mode, you are using google map, right? 
  
 If so, google map tile request is multi thread, and it can’t be caught by main thread, means you can’t just try catch to know the exception. 
  
 We have noticed this problem and will find a way to resolve it. 
  
 If not, please let me know more details. 
  
 Regards, 
  
 Gary

No, I’m loading shape files. As I load each layer I set  
  
 layer.TileType = TileType.HybridTile;

Here is a good example of what I am talking about. 
  
 I’m handling MapClick and doing some processing. If I click quickly I get the following exception. It doesn’t event get to MapClick when this is thrown so the map is throwing this somewhere. I don’t know where it is being thrown and I don’t know where to trap this or how to handle it: 
  
 System.InvalidOperationException was unhandled 
   Message=The FeatureSource is not open.   Please call the Open method before calling this method. 
   Source=WpfDesktopEdition 
   StackTrace: 
        at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.<>c__DisplayClass2.<DrawException>b__0() 
        at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
        at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
        at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
        at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
        at System.Threading.ExecutionContext.runTryCode(Object userData) 
        at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
        at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
        at System.Windows.Threading.DispatcherOperation.Invoke() 
        at System.Windows.Threading.Dispatcher.ProcessQueue() 
        at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
        at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
        at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
        at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
        at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
        at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
        at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
        at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
        at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
        at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
        at System.Windows.Application.RunDispatcher(Object ignore) 
        at System.Windows.Application.RunInternal(Window window) 
        at System.Windows.Application.Run(Window window) 
        at System.Windows.Application.Run() 
        at Kern.Client.Windows.Presentation.App.Main() in C:\TFS\KernMobile_V5\Main\Kern.Client.Windows\Kern.Client.Windows.Presentation\obj\x86\Debug\App.g.cs:line 50 
        at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
        at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
        at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
        at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
        at System.Threading.ThreadHelper.ThreadStart() 
   InnerException:  
  
  
  


Hello Steve, 
  
 In your scenario, you can use set the 
   
 ecwLayer.DrawingExceptionMode = DrawingExceptionMode.DrawException 
  
 and subscribe an event e.g.  
  
 ecwLayer.DrawingException += new EventHandler<DrawingExceptionLayerEventArgs>(DoSomeThing) 
  
 and you can trap the exception when it is being raised. 
  
 Regards, 
  
 Gary