This class provides helper functions for handling errors and displaying them to users
Inheritance: System.Windows.Forms.Form
        /// <summary>
        /// Displays exception information. Should be called from try...catch handlers
        /// </summary>
        /// <param name="ex">Exception object to handle</param>
        new public static void Handle(Exception ex)
        {
            if (ex != null)
            {
                // invalid regex - only ArgumentException, without subclasses
                if (ex.GetType().ToString().Equals("System.ArgumentException")
                    && ex.StackTrace.Contains("System.Text.RegularExpressions"))
                {
                    MessageBox.Show(ex.Message, "Invalid regular expression",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                // network access error
                else if (ex is System.Net.WebException)
                {
                    MessageBox.Show(ex.Message, "Network access error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                // out of memory error
                else if (ex is System.OutOfMemoryException)
                {
                    MessageBox.Show(ex.Message, "Out of Memory error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else // suggest a bug report for other exceptions
                {
                    ErrorHandler handler = new ErrorHandler();

                    handler.txtError.Text = ex.Message;

                    StringBuilder errorMessage = new StringBuilder("{{AWB bug\r\n | status      = new <!-- when fixed replace with \"fixed\" -->\r\n | description = ");

                    if (Thread.CurrentThread.Name != "Main thread")
                        errorMessage.Append("\r\nThread: " + Thread.CurrentThread.Name);

                    errorMessage.Append("<table>");
                    FormatException(ex, errorMessage, true);
                    errorMessage.Append("</table>\r\n~~~~\r\n | OS          = " + Environment.OSVersion.ToString() + "\r\n | version     = " + Assembly.GetExecutingAssembly().GetName().Version.ToString());

                    if (!Variables.Revision.Contains("?")) errorMessage.Append(", revision " + Variables.Revision);

                    if (!string.IsNullOrEmpty(CurrentPage))
                    {
                        // don't use Tools.WikiEncode here, to keep code portable to updater
                        // as it's not a pretty URL, we don't need to follow the MediaWiki encoding rules
                        string link = "[" + Variables.URLLong + "index.php?title=" + HttpUtility.UrlEncode(CurrentPage) + "&oldid=" + CurrentRevision.ToString() + "]";

                        errorMessage.Append("\r\n | duplicate = [encountered while processing page ''" + link + "'']");
                    } else if (!string.IsNullOrEmpty(ListMakerText))
                        errorMessage.Append("\r\n | duplicate = '''ListMaker Text:''' " + ListMakerText);

                    errorMessage.Append("\r\n}}");

                    handler.txtDetails.Text = errorMessage.ToString();

                    handler.txtSubject.Text = ex.GetType().Name + " in " + Thrower(ex);

                    handler.ShowDialog();
                }
            }
        }
        /// <summary>
        /// Displays exception information. Should be called from try...catch handlers
        /// </summary>
        /// <param name="ex">Exception object to handle</param>
        new public static void Handle(Exception ex)
        {
            if (ex == null || HandleKnownExceptions(ex)) return;

            // suggest a bug report for other exceptions
            ErrorHandler handler = new ErrorHandler { txtError = { Text = ex.Message } };

            StringBuilder errorMessage = new StringBuilder("{{AWB bug\r\n | status      = new <!-- when fixed replace with \"fixed\" -->\r\n | description = ");

            var thread = ex is ApiException ? (ex as ApiException).ThrowingThread : Thread.CurrentThread;
            if (thread.Name != "Main thread")
                errorMessage.AppendLine("nThread: " + thread.Name);

            errorMessage.Append("<table>");
            FormatException(ex, errorMessage, ExceptionKind.TopLevel);
            errorMessage.AppendLine("</table>\r\n~~~~");
            errorMessage.AppendLine(" | OS          = " + Environment.OSVersion);
            errorMessage.Append(" | version     = " + Assembly.GetExecutingAssembly().GetName().Version);

            // suppress unhandled exception if Variables constructor says 'ouch'
            string revision;
            try
            {
                revision = Variables.Revision;
            }
            catch
            {
                revision = "?";
            }

            if (!revision.Contains("?")) errorMessage.AppendLine(", revision " + revision);

            errorMessage.AppendLine(" | net     = " + Environment.Version);

            if (!string.IsNullOrEmpty(CurrentPage))
            {
                // don't use Tools.WikiEncode here, to keep code portable to updater
                // as it's not a pretty URL, we don't need to follow the MediaWiki encoding rules
                string link = "[" + Variables.URLIndex + "?title=" + HttpUtility.UrlEncode(CurrentPage) + "&oldid=" + CurrentRevision + "]";

                errorMessage.AppendLine(" | duplicate   = [encountered while processing page ''" + link + "'']");
            }
            else if (!string.IsNullOrEmpty(ListMakerText))
                errorMessage.AppendLine(" | duplicate   = '''ListMaker Text:''' " + ListMakerText);

            if (!string.IsNullOrEmpty(Variables.URL))
                errorMessage.AppendLine(" | site    = " + Variables.URL);

            errorMessage.AppendLine(" | workaround     = <!-- Any workaround for the problem -->");
            errorMessage.AppendLine(" | fix_version    = <!-- Version of AWB the fix will be included in; AWB developer will complete when it's fixed -->");
            errorMessage.AppendLine("}}");

            handler.txtDetails.Text = errorMessage.ToString();

            handler.txtSubject.Text = ex.GetType().Name + " in " + Thrower(ex);

            handler.ShowDialog();
        }
        /// <summary>
        /// Displays exception information. Should be called from try...catch handlers
        /// </summary>
        /// <param name="ex">Exception object to handle</param>
        new public static void Handle(Exception ex)
        {
            if (ex != null)
            {
                // invalid regex - only ArgumentException, without subclasses
                if (ex.GetType().ToString().Equals("System.ArgumentException")
                    && ex.StackTrace.Contains("System.Text.RegularExpressions"))
                {
                    MessageBox.Show(ex.Message, "Invalid regular expression",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                // network access error
                else if (ex is System.Net.WebException)
                {
                    MessageBox.Show(ex.Message, "Network access error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                // out of memory error
                else if (ex is System.OutOfMemoryException)
                {
                    MessageBox.Show(ex.Message, "Out of Memory error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else // suggest a bug report for other exceptions
                {
                    ErrorHandler handler = new ErrorHandler();

                    handler.txtError.Text = ex.Message;

                    StringBuilder errorMessage = new StringBuilder("{{AWB bug\r\n | status      = new <!-- when fixed replace with \"fixed\" -->\r\n | description = <table><tr><td>Exception:<td><code>" + ex.GetType().Name + "</code><tr><td>Message:<td><code>" +
                        ex.Message + "</code><tr><td>Call stack:<td><pre>" + ex.StackTrace + "</pre>");

                    if (Thread.CurrentThread.Name != "Main thread")
                        errorMessage.Append("\r\nThread: " + Thread.CurrentThread.Name);
                    
                    errorMessage.Append("</table>\r\n~~~~\r\n | OS          = " + Environment.OSVersion.ToString() + "\r\n | version     = " + Assembly.GetExecutingAssembly().GetName().Version.ToString());

                    if (!string.IsNullOrEmpty(CurrentArticle))
                    {
                        string link = "[" + Variables.URLLong + "index.php?title=" + Tools.WikiEncode(CurrentArticle) + "&oldid=" + CurrentRevision.ToString() + "]";

                        errorMessage.Append("\r\n | duplicate = [encountered while processing page ''" + link + "'']");
                    } else if (!string.IsNullOrEmpty(ListMakerText))
                        errorMessage.Append("\r\n | duplicate = '''ListMaker Text:''' " + ListMakerText);

                    errorMessage.Append("\r\n}}");

                    handler.txtDetails.Text = errorMessage.ToString();

                    handler.textBox1.Text = "AWB encountered " + ex.GetType().Name;

                    handler.ShowDialog();
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// Displays exception information. Should be called from try...catch handlers
        /// </summary>
        /// <param name="ex">Exception object to handle</param>
        public static void HandleException(Exception ex)
        {
            if (ex == null || HandleKnownExceptions(ex)) return;

            // TODO: suggest a bug report for other exceptions
            ErrorHandler handler = new ErrorHandler {txtError = {Text = ex.Message}};

            var errorMessage = new BugReport(ex).PrintForPhabricator();
            handler.txtDetails.Text = errorMessage;

            handler.txtSubject.Text = ex.GetType().Name + " in " + Thrower(ex);

            Tools.WriteDebug("HandleException", errorMessage);
            handler.ShowDialog();
        }
        /// <summary>
        /// Displays exception information. Should be called from try...catch handlers
        /// </summary>
        /// <param name="ex">Exception object to handle</param>
        new public static void Handle(Exception ex)
        {
            if (ex == null) return;

            // invalid regex - only ArgumentException, without subclasses
            if (ex is ArgumentException && ex.StackTrace.Contains("System.Text.RegularExpressions"))
            {
                MessageBox.Show(ex.Message, "Invalid regular expression",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // network access error
            else if (ex is System.Net.WebException || ex.InnerException is System.Net.WebException)
            {
                MessageBox.Show(ex.Message, "Network access error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // out of memory error
            else if (ex is OutOfMemoryException)
            {
                MessageBox.Show(ex.Message, "Out of Memory error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // disk writer error / full
            else if (ex is System.IO.IOException || ex is ConfigurationErrorsException 
                && (ex.InnerException != null && ex.InnerException.InnerException != null 
                && ex.InnerException.InnerException is System.IO.IOException))
            {
                MessageBox.Show(ex.Message, "Disk write error - is disk full?",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else // suggest a bug report for other exceptions
            {
                ErrorHandler handler = new ErrorHandler {txtError = {Text = ex.Message}};

                StringBuilder errorMessage = new StringBuilder("{{AWB bug\r\n | status      = new <!-- when fixed replace with \"fixed\" -->\r\n | description = ");

                if (Thread.CurrentThread.Name != "Main thread")
                    errorMessage.Append("\r\nThread: " + Thread.CurrentThread.Name);

                errorMessage.Append("<table>");
                FormatException(ex, errorMessage, ExceptionKind.TopLevel);
                errorMessage.Append("</table>\r\n~~~~\r\n | OS          = " + Environment.OSVersion + "\r\n | version     = " + Assembly.GetExecutingAssembly().GetName().Version);

                // suppress unhandled exception if Variables constructor says 'ouch'
                string revision;
                try
                {
                    revision = Variables.Revision;
                }
                catch
                {
                    revision = "?";
                }

                if (!revision.Contains("?")) errorMessage.Append(", revision " + revision);

                if (!string.IsNullOrEmpty(CurrentPage))
                {
                    // don't use Tools.WikiEncode here, to keep code portable to updater
                    // as it's not a pretty URL, we don't need to follow the MediaWiki encoding rules
                    string link = "[" + Variables.URLIndex + "?title=" + HttpUtility.UrlEncode(CurrentPage) + "&oldid=" + CurrentRevision + "]";

                    errorMessage.Append("\r\n | duplicate = [encountered while processing page ''" + link + "'']");
                }
                else if (!string.IsNullOrEmpty(ListMakerText))
                    errorMessage.Append("\r\n | duplicate = '''ListMaker Text:''' " + ListMakerText);

                if (!string.IsNullOrEmpty(Variables.URL))
                    errorMessage.Append("\r\n | site = " + Variables.URL);

                errorMessage.Append("\r\n}}");

                handler.txtDetails.Text = errorMessage.ToString();

                handler.txtSubject.Text = ex.GetType().Name + " in " + Thrower(ex);

                handler.ShowDialog();
            }
        }