public void HandleException(ETCPGeckoException exc)
 {
     if (mainForm.InvokeRequired)
     {
         mainForm.Invoke((MethodInvoker)delegate
         {
             HandleExceptionInternally(exc);
         });
     }
     else
     {
         HandleExceptionInternally(exc);
     }
 }
        private void HandleExceptionInternally(ETCPGeckoException exc)
        {
            Logger.WriteLineTimed("Exception occured!");
            Logger.WriteLine("Message: " + exc.Message);
            Logger.WriteLine("Stack Trace: \r\n" + exc.StackTrace);
            Logger.WriteLine("Inner Exception: " + exc.InnerException);

            // Try to quietly reconnect first
            mainForm.CTCPGecko_Click(mainForm, new EventArgs());
            if (mainForm.Text.Contains("(")) return;

            // If the result has no (, then it we failed, so be loud
            mainForm.DisconnectButton_Click(mainForm, new EventArgs());
            ETCPErrorCode error = exc.ErrorCode;
            String msg = "";
            switch (error)
            {
                case ETCPErrorCode.CheatStreamSizeInvalid: msg = "Cheat stream size is invalid!"; break;
                case ETCPErrorCode.FTDICommandSendError: msg = "Error sending a command to the TCP Gecko!"; break;
                case ETCPErrorCode.FTDIInvalidReply: msg = "Received an invalid reply from the TCP Gecko!"; break;
                case ETCPErrorCode.FTDIPurgeRxError: msg = "Error occured while purging receive data buffer!"; break;
                case ETCPErrorCode.FTDIPurgeTxError: msg = "Error occured while purging transfer data buffer!"; break;
                case ETCPErrorCode.FTDIQueryError: msg = "Error querying TCP Gecko data!"; break;
                case ETCPErrorCode.FTDIReadDataError: msg = "Error reading TCP Gecko data!"; break;
                case ETCPErrorCode.FTDIResetError: msg = "Error resetting the TCP Gecko connection!"; break;
                case ETCPErrorCode.FTDITimeoutSetError: msg = "Error setting send/receive timeouts!"; break;
                case ETCPErrorCode.FTDITransferSetError: msg = "Error setting transfer buffer sizes!"; break;
                case ETCPErrorCode.noFTDIDevicesFound: msg = "No FTDI devices found! Please make sure your TCP Gecko is connected!"; break;
                case ETCPErrorCode.noTCPGeckoFound: msg = "No TCP Gecko device found! Please make sure your TCP Gecko is connected!"; break;
                case ETCPErrorCode.REGStreamSizeInvalid: msg = "Register stream data invalid!"; break;
                case ETCPErrorCode.TooManyRetries: msg = "Too many retries while attempting to transfer data!"; break;
                default: msg = "An unknown error occured"; break;
            }
            if (MessageBox.Show("During the connection with the TCP Gecko an error occured. The error description was: \n\n" +
                                msg + "\n\nDo you want to retry connecting to the TCP Gecko?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Error,
                                MessageBoxDefaultButton.Button1) == DialogResult.Yes)
            {
                mainForm.CTCPGecko_Click(mainForm, new EventArgs());
            }
        }