Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不关闭应用程序的情况下处理异常?_C#_Wpf_Exception Handling - Fatal编程技术网

C# 如何在不关闭应用程序的情况下处理异常?

C# 如何在不关闭应用程序的情况下处理异常?,c#,wpf,exception-handling,C#,Wpf,Exception Handling,我有一个通过WPF C应用程序发送电子邮件的尝试,如下所示: try { smtpmail.Send(message); } catch (Exception err) { throw new CustomException("Error contacting server.", err); } 但是,如果出现此错误,我不希望应用程序停止运行/崩溃。相反,只需将错误更改为我在应用程序中设置的错误消息文本框…或与不使应用程序崩溃相关的内容,而是通知用户稍后重试,或者如果问

我有一个通过WPF C应用程序发送电子邮件的尝试,如下所示:

try { smtpmail.Send(message); }
            catch (Exception err) { throw new CustomException("Error contacting server.", err); }
但是,如果出现此错误,我不希望应用程序停止运行/崩溃。相反,只需将错误更改为我在应用程序中设置的错误消息文本框…或与不使应用程序崩溃相关的内容,而是通知用户稍后重试,或者如果问题仍然存在:请与某某联系

编辑:预期:要记录的错误,但用户看到了这一点

errorMsg.Text = "Error contacting server. Try again later, or if problem persists contact Billy Bob Boo";
我如何着手实施这一点


更新:对于这个不清楚的问题表示歉意。基本上,我需要关于如何记录我的错误的帮助,但向用户显示一条友好的错误消息……但我要求得很差。使用提供的评论和答案,我做了更多的研究,回答了下面我自己的问题。谢谢大家

为什么要捕获异常,然后再次抛出它?这似乎不是很有效

您可以使用messagebox

try { 
    smtpmail.Send(message); 
}catch (Exception err) { 
    MessageBox.Show(err.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error);
}

编辑:你刚才说你不想让用户知道这个异常。好吧,那就让catch块空着吧:

我是如何解决我的问题的:

bool success = false;
            try { 
                //try to send the message
                smtpmail.Send(message);
                success = true;//everything is good
            }
            catch (Exception err)
            {
                //error with sending the message
                errorMsg.Text = ("Unable to send mail at this time. Please try again later.");

                //log the error 
                errorLog.Log(err); //note errorLog is another method to log the error


                //other stuff relating to certain parts of the application visibility

            }
            finally
            {
                if (success)
                { 
                    //what to do if the email was successfully sent
                }
            }

如果你要抛出,你需要在某个地方捕获。如果你不想抛出错误,为什么你要捕获错误,然后抛出另一个异常?可能抛出了一个异常,你的程序崩溃,因为你抛出了一个异常。你接住它,但它会重新扔出去。捕获链上更远的错误并记录/显示错误消息但不要使程序崩溃,或者在此处执行该操作。@Savanna我捕获并声明异常错误,但不要在任何地方使用它。我不想让用户确切地知道错误是什么,所以我抛出了一个CustomException你被困在哪里?你知道如何将文本放入文本框吗?解决方案的哪一部分让你困惑?只需将catch块留空,这是一个糟糕的建议。异常至少应该被记录下来,一条不一定透露细节的错误消息也应该显示出来。@tnw我这么说是因为他说他不想在任何地方使用它,也不想让用户知道它。但你是对的,他至少应该把它记录到一个文件或什么的。是的,我至少想把它记录到某个地方。尽管我会对其进行一些调整,这样用户就不会进入完成页面,但答案仍然有效。为什么要挂成功旗?只需将这些操作放在smtpmail.Send之后。最后,无论是否引发异常,都应该使用块来执行代码。