我创建了以下C#程序:
namespace dispose_test
{
class Program
{
static void Main(string[] args)
{
using (var disp = new MyDisposable())
{
throw new Exception("Boom");
}
}
}
public class MyDisposable : IDisposable
{
public void Dispose()
{
Console.WriteLine("Disposed");
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用它时dotnet run,我看到以下行为:
Windows上的延迟很烦人,但是在Linux上根本没有调用Dispose()的事实令人不安.这是预期的行为吗?
编辑以下对话中的澄清/补充:
using/Dispose(),这只是一个特例try/finally.行为也通常发生try/finally- finally块未运行.我更新了标题以反映这一点.Dispose()通过将文件写入文件系统来执行,只是为了确保问题与stdout Dispose()在未处理的异常情况下运行之前与控制台断开连接无关.行为是一样的.Dispose()如果在应用程序中的任何位置捕获到异常,则会调用它.当应用程序完全未处理时会发生此行为.dotnet run在两个平台上进行的,这意味着单独的编译,但我也试过dotnet publish在Windows上直接运行两个平台上的输出,结果相同.唯一的区别是,当直接在Linux上运行时,在异常文本之后写入"Aborted(core dumped)"文本.版本细节:
dotnet --version - > 1.0.4.可能重复:
发布模式下的异常处理问题
我怀疑对此有一个非常简单的解释,但我似乎无法找到它.
当我的WinForms C#4.0应用程序在Program.cs文件中加载自身时,整个Main()函数内部都有一个try/catch语句.
我编写了一个小异常包装器,其行为与vanilla .net"未捕获异常"框非常相似,除了它提供了更多信息,允许保存(序列化)异常树,并允许用户提交错误直接向我汇报.
现在,它在调试时工作正常(F5).如果我在主线程中的程序中的任何地方触发异常,如果没有try/catch,则异常会一直触发到Main()并显示自定义窗口.
(我已经考虑并妥善处理的所有其他例外情况).
当我仅通过运行.exe文件运行程序时,会出现vanilla .net异常框,而不是我编码的那个.
有什么理由可以想到为什么会发生这种情况?最奇怪的是,它在调试模式下运行与自行运行时的行为完全不同.我正在构建为调试 - 而不是发布.
编辑(3月22日至11日):
我只是在这里添加一个小附录,以防你们中的一些人无法在下面接受的答案的评论中找到答案:忘记我说我正在构建调试而不是发布.这没有关系 - 我只是添加它以获取额外信息.重要的是,当我在VS中调试ging时,异常会按预期被捕获,但是当在VS外部执行我的EXE时,它们不是.
正如Cody所说,Application.Run()它有自己的异常处理程序,这就是为什么它们永远不会到达我的主要部分catch,但我提到我甚至没有Application.Run()在我的代码中使用任何地方...而是我的GUI首先启动Form.ShowDialog().
我已经做了一些实验,并且可以确认Form.ShowDialog()行为与Application.Run()在方法本身内处理异常的行为相同.
一个简单的控制台应用程序,在 Visual Studio 2019、.Net Framework 4.7、Windows 中:
static void Main(string[] args)
{
try
{
Console.WriteLine("In try");
throw new IndexOutOfRangeException();
}
finally
{ *// Surprisingly this part is not being executed.*
Console.WriteLine("In finally");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
我确信在没有异常的情况下以及在有异常的情况下都会调用finally块。我在文档中读到:
但是,如果异常未处理,则finally块的执行取决于异常展开操作的触发方式。反过来,这取决于您的计算机的设置方式。
嗯,我很困惑。我是否需要对这个“展开操作”做一些事情,以便在出现未处理的异常时调用finally?
c# finally try-catch console-application unhandled-exception
我有这个代码的应用程序:
Module Startup
<STAThread()> _
Public Sub Main()
Try
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
InitApp()
Dim login As New LoginForm()
Dim main As New MainForm()
Application.Run(login)
If login.DialogResult = DialogResult.OK Then
ActUser = login.LoggedUser
main.ShowDialog()
End If
DisposeApp()
Catch ex As Exception
ErrMsg(ex, "Error!", ErrorLogger.ErrMsgType.CriticalError)
End
End Try
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
在调试模式下,everithing就可以了.但是在发布模式下,当应用程序异常发生时,我在Main方法中的全局catch不会捕获异常.
请问有什么问题?
编辑:来自应用程序的未处理异常是在Web服务调用失败后抛出WebException.
我该如何处理这类异常?