即使捕获到异常,是不是有任何方法可以找到 .net 应用程序崩溃的原因

Posted

技术标签:

【中文标题】即使捕获到异常,是不是有任何方法可以找到 .net 应用程序崩溃的原因【英文标题】:is there any way to find reason for .net app crash even if Exceptions are caught即使捕获到异常,是否有任何方法可以找到 .net 应用程序崩溃的原因 【发布时间】:2021-08-24 06:38:07 【问题描述】:

我有 .net 应用程序,它在登录后 ping 特定端口。我已经包围了 try catch 中的逻辑,并在我的日志中捕获了 System.net.webException。但在某些 Windows 机器中,这会导致应用随机崩溃。


Error Message: WebException

Exception Type: System.Net.WebException

Error Location : Unable to connect to the remote server

InnerException: System.Net.Sockets.SocketException (0x80004005): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 127.0.0.1:9000
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)

StackTrace:    at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   at System.Net.HttpWebRequest.GetRequestStream()
   at tpsyncagent.MainWindow.<ConnectToTally>d__36.MoveNext() in C:\code\tpdesktopsyncagent\MainWindow.xaml.cs:line 247

这是代码片段

try

    Stream dataStream = TallyRequest.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();

catch(Exception e)

    //logging code

【问题讨论】:

你可以检查windows事件查看器是否有异常 【参考方案1】:

如果您遇到随机崩溃,请尝试在您的 App 类中放置一个包罗万象的异常处理程序:

protected override void OnStartup(StartupEventArgs e)

    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    ... etc ...

然后在该处理程序中转储异常的消息、内部异常和 StackTrace 以查看它被抛出的位置。在这种特殊情况下,您知道这是一个 SocketException,因此您也可以将异常转换为该异常并检查其 SocketErrorCode 属性以获取更多信息。

【讨论】:

以上是关于即使捕获到异常,是不是有任何方法可以找到 .net 应用程序崩溃的原因的主要内容,如果未能解决你的问题,请参考以下文章

在 C#.NET 中捕获所有未处理异常的简单方法

前端捕获异常技巧总结

即使捕获到异常,应用程序也会崩溃(关闭)

.Net 6.0全局异常捕获

elmah 是不是也处理捕获的异常

我在哪里捕获 MVVM 中的异常?