(MVC) MVC (2018)

Trap unhandled exception in windows application.

Best problem of windows desktop application is multithreading, and if multithreading code is incorrectly, for example marshaling data from background thread to frontend winform thread, windows application is disappear without any error message.

In this case I start desktop MDI WinForms application. And firstly need to set start point of application.



So, Below I show my real starter code of win apps with trap of exception in other thread.


   1:  Imports System.Security.Permissions
   2:  Imports System.Threading
   3:  Imports System.Runtime.InteropServices
   4:   
   5:   
   6:  Public Module Starter
   7:   
   8:      <DllImport("user32.dll")>
   9:      Private Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
  10:      End Function
  11:   
  12:      <DllImport("Kernel32")>
  13:      Private Function GetConsoleWindow() As IntPtr
  14:      End Function
  15:   
  16:      Const SW_HIDE As Integer = 0
  17:      Const SW_SHOW As Integer = 5
  18:   
  19:      Public frmCat_instance As frmCat
  20:      Public frmCatList_instance As frmCatList
  21:      Public frmCoChang_instance As frmCoChang
  22:      Public frmCoList_instance As frmCoList
  23:      Public frmCost_instance As frmCost
  24:      Public frmExport_instance As frmExport
  25:      Public frmGoJoin_instance As frmGoJoin
  26:      Public frmGoList_instance As frmGoList
  27:      Public frmGood_instance As frmGood
  28:      Public frmHiList_instance As frmHiList
  29:      Public frmImport_instance As frmImport
  30:      Public frmLogin_instance As frmLogin
  31:      Public frmMain_instance As frmMain
  32:      Public frmMaList_instance As frmMaList
  33:      Public frmMarket_instance As frmMarket
  34:      Public frmPassCng_instance As frmPassCng
  35:      Public frmProList_instance As frmProList
  36:      Public frmProvider_instance As frmProvider
  37:      Public frmRaList_instance As frmRaList
  38:      Public frmReport_instance As frmReport
  39:      Public frmSett_instance As frmSett
  40:      Public frmSpec_instance As frmSpec
  41:      Public frmSpList_instance As frmSpList
  42:      Public frmUser_instance As frmUser
  43:      Public frmUsList_instance As frmUsList
  44:      Public frmWelcome_instance As frmWelcome
  45:   
  46:   
  47:      <SecurityPermission(SecurityAction.Demand, Flags:=SecurityPermissionFlag.ControlAppDomain)>
  48:      Public Sub Main(ByVal args As String())
  49:   
  50:          Dim hwnd As IntPtr
  51:          hwnd = GetConsoleWindow()
  52:          ShowWindow(hwnd, SW_HIDE)
  53:   
  54:          AddHandler Application.ThreadException, New ThreadExceptionEventHandler(AddressOf Form1_UIThreadException)
  55:          Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
  56:          AddHandler AppDomain.CurrentDomain.UnhandledException, New UnhandledExceptionEventHandler(AddressOf CurrentDomain_UnhandledException)
  57:   
  58:          frmCat_instance = New frmCat
  59:          frmCatList_instance = New frmCatList
  60:          frmCoChang_instance = New frmCoChang
  61:          frmCoList_instance = New frmCoList
  62:          frmCost_instance = New frmCost
  63:          frmExport_instance = New frmExport
  64:          frmGoJoin_instance = New frmGoJoin
  65:          frmGoList_instance = New frmGoList
  66:          frmGood_instance = New frmGood
  67:          frmHiList_instance = New frmHiList
  68:          frmImport_instance = New frmImport
  69:          frmLogin_instance = New frmLogin
  70:          frmMain_instance = New frmMain
  71:          frmMaList_instance = New frmMaList
  72:          frmMarket_instance = New frmMarket
  73:          frmPassCng_instance = New frmPassCng
  74:          frmProList_instance = New frmProList
  75:          frmProvider_instance = New frmProvider
  76:          frmRaList_instance = New frmRaList
  77:          frmReport_instance = New frmReport
  78:          frmSett_instance = New frmSett
  79:          frmSpec_instance = New frmSpec
  80:          frmSpList_instance = New frmSpList
  81:          frmUser_instance = New frmUser
  82:          frmUsList_instance = New frmUsList
  83:          frmWelcome_instance = New frmWelcome
  84:   
  85:   
  86:          Application.Run(frmMain_instance)
  87:      End Sub
  88:   
  89:   
  90:      Private Sub Form1_UIThreadException(ByVal sender As Object, ByVal t As ThreadExceptionEventArgs)
  91:          Dim result As DialogResult = DialogResult.Cancel
  92:   
  93:          Try
  94:              result = ShowThreadExceptionDialog("Fatal Error", t.Exception)
  95:              If result = DialogResult.Abort Then Application.[Exit]()
  96:          Catch
  97:              Try
  98:                  MessageBox.Show("Fatal Windows Forms Error", "UIThreadException", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.[Stop])
  99:              Finally
 100:                  Application.[Exit]()
 101:              End Try
 102:          End Try
 103:   
 104:          Try
 105:              Dim ex As Exception = CType(t.Exception, Exception)
 106:              Dim DB1 As New BravoDB
 107:              DB1.errors.Add(New _error With {._date = Now, .error1 = GetMyIP().ToString & vbLf & ex.Message & vbLf + ex.StackTrace})
 108:              DB1.SaveChanges()
 109:   
 110:          Catch ex As Exception
 111:   
 112:              Try
 113:                  MessageBox.Show("Sending error to server impossible", "UIThreadException", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.[Stop])
 114:              Finally
 115:                  Application.[Exit]()
 116:              End Try
 117:          End Try
 118:   
 119:      End Sub
 120:   
 121:      Private Sub CurrentDomain_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
 122:          Dim errorMsg As String = "Fatal Non-UI Error:" & vbLf & vbLf
 123:          Dim ex As Exception = CType(e.ExceptionObject, Exception)
 124:          Try
 125:   
 126:              Dim DB1 As New BravoDB
 127:              DB1.errors.Add(New _error With {._date = Now, .error1 = GetMyIP().ToString & vbLf & ex.Message & vbLf + ex.StackTrace})
 128:              DB1.SaveChanges()
 129:   
 130:          Catch exc As Exception
 131:              MessageBox.Show("Sending error to server impossible", "UnhandledException", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.[Stop])
 132:          Finally
 133:              Application.[Exit]()
 134:          End Try
 135:   
 136:          Try
 137:              Dim myLog As EventLog = New EventLog()
 138:              myLog.Source = "ThreadException"
 139:              myLog.WriteEntry(errorMsg & ex.Message & vbLf & vbLf & "Stack Trace:" & vbLf + ex.StackTrace)
 140:          Catch exc As Exception
 141:   
 142:              Try
 143:                  MessageBox.Show("Could not write the error to the event log. Reason: " & exc.Message, "UnhandledException", MessageBoxButtons.OK, MessageBoxIcon.[Stop])
 144:              Finally
 145:                  Application.[Exit]()
 146:              End Try
 147:          End Try
 148:      End Sub
 149:   
 150:      Public Function ShowThreadExceptionDialog(ByVal title As String, ByVal e As Exception) As DialogResult
 151:          Dim errorMsg As String = "An application error occurred. Please contact the adminstrator " & "with the following information:" & vbLf & vbLf
 152:          errorMsg = errorMsg & e.Message & vbLf & vbLf & "Stack Trace:" & vbLf + e.StackTrace
 153:          Return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.[Stop])
 154:      End Function
 155:   
 156:      Public Function GetMyIP() As Net.IPAddress
 157:          Try
 158:              Using wc As New Net.WebClient
 159:                  Return Net.IPAddress.Parse(Text.Encoding.ASCII.GetString(wc.DownloadData("http://tools.feron.it/php/ip.php")))
 160:              End Using
 161:          Catch ex As Exception
 162:              Return New Net.IPAddress(0)
 163:          End Try
 164:   
 165:      End Function
 166:   
 167:  End Module

This code show black screen of console application to short time and after that this windows is disappear and appear a main window of winforms application.



Additionally my code collect application error to server.



More example to use this starter Multithreading Parsers with Parallel, CsQuery, Newtonsoft.Json, OfficeOpenXml and IAsyncResult/AsyncCallback.



Comments ( )
Link to this page: //www.vb-net.com/StarterWinApps/index.htm
< THANKS ME>