相关疑难解决方法(0)

.NET Core:最后一块没有在Linux上调用未处理的异常

我创建了以下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:写入控制台的异常文本,"Disposed"打印~20秒后,程序退出.
  • Linux:写入控制台的异常文本,程序立即退出."处置"从未写过.

Windows上的延迟很烦人,但是在Linux上根本没有调用Dispose()的事实令人不安.这是预期的行为吗?

编辑以下对话中的澄清/补充:

  • 这不是特定的using/Dispose(),这只是一个特例try/finally.行为也通常发生try/finally- finally块未运行.我更新了标题以反映这一点.
  • 我还检查了Dispose()通过将文件写入文件系统来执行,只是为了确保问题与stdout Dispose()在未处理的异常情况下运行之前与控制台断开连接无关.行为是一样的.
  • Dispose()如果在应用程序中的任何位置捕获到异常,则会调用它.当应用程序完全未处理时会发生此行为.
  • 在Windows上,长差距不是由于编译延迟.当异常文本写入控制台时,我开始计时.
  • 我最初的实验是dotnet run在两个平台上进行的,这意味着单独的编译,但我也试过dotnet publish在Windows上直接运行两个平台上的输出,结果相同.唯一的区别是,当直接在Linux上运行时,在异常文本之后写入"Aborted(core dumped)"文本.

版本细节:

  • dotnet --version - > 1.0.4.
  • 编译为netcoreapp1.1,在.NET Core …

c# linux .net-core

13
推荐指数
1
解决办法
878
查看次数

C#异常仅在调试时被捕获?

可能重复:
发布模式下的异常处理问题

我怀疑对此有一个非常简单的解释,但我似乎无法找到它.

当我的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()在方法本身内处理异常的行为相同.

.net c# debugging exception-handling exception

5
推荐指数
1
解决办法
5213
查看次数

.Net Framework:当未捕获异常时,不会调用Finally块

一个简单的控制台应用程序,在 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

5
推荐指数
0
解决办法
248
查看次数

发布模式下的异常处理问题

我有这个代码的应用程序:

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.

我该如何处理这类异常?

vb.net exception-handling exception

3
推荐指数
1
解决办法
2175
查看次数