System.IO.FileNotFoundException 是什么意思

What's the meaning of a System.IO.FileNotFoundException

我在 C# 程序中有这段代码:

ListOfCabins();
ListOfWoodTypes();

第一个函数如下所示:

private void ListOfCabins()
{
    Logger.Info($"Start function ListOfCabins()");

    try
    {
    }
    catch (Exception ex)
    {
         ...
    }

    Logger.Info($"End of function ListOfCabins()");
}

其他函数如下:

private void ListOfWoodTypes()
{
    Logger.Info($"Start function ListOfWoodTypes()");
    ...

Logger是一个典型的NLog对象:

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

在日志中,我看到:

End of function ListOfCabins()

我没看到:

Start function ListOfWoodTypes()

我的应用程序崩溃,在事件日志中我看到:

Application: ...
Framework Version: v4.0.30319
Description: The process wa terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
  at ...ListOfWoodTypes()
  at ...

我在这里有不同的问题:

Edit1,无法调试
我在自己的 PC 上开发这个程序,我在这里构建它,但我随后将可执行文件复制到我客户的 PC 上,因此无法进行调试。

重新打开请求
我的问题与“.NET Global exception handler in console application”无关,它是针对这个异常的。此外,Windows 事件日志中并未完全处理此特定异常,正如我自己的回答中所见。

让我开始吧 - 这并不像听起来那么容易。正如他们所说,细节决定成败...

System.IO.FileNotFoundException

这通常意味着有人扔了它。时期。它是为了找不到文件而抛出的,但我看到系统异常被愚蠢的程序员滥用,或者“找不到文件”被解释得相当复杂(网络流可以使用文件 api 打开)在次。因此,虽然它表示 - 你知道 - 找不到文件,但不能 100% 确定这是触发文件的原因。

Why is a System.IO.FileNotFoundException not catched by my try ... catch (Exception ex) clause?

你告诉我们。它应该是 - 如果它被扔在里面。

你自己的代码前后都有logger信息。并且日志记录可能会进入 - 猜猜是什么 - 一个文件。假设第一行可能抛出错误并不完全是超现实的。

我们不知道 - 你应该知道。在调试器中,抛出此异常时中断。获取它被抛出的确切位置。查看调用堆栈。查看属性。异常通常包含额外的数据——消息,可能还有属性。只是告诉我们细节就像“梅赛德斯撞车了,出了什么问题”。调试细节可能会回答您的所有问题。

What about the logs? I'm expecting to see at least the first line of the ListOfWoodTypes() function.

是的,除非该行抛出异常。 如果没有日志文件,我会强烈建议 - 你知道 - 日志记录是问题所在。

Does this mean that there is some buffering in NLog technology, causing NLog logging to have some delay on a crash?

好吧,该技术是“使用标准 .NET 缓存”...不使用它是完全愚蠢的。看,问题是如果你不缓存,你需要大量的 disci IO,这可能会使日志记录成为主要的性能消耗。你不能有这个。

但是:缓存与否,文件在吗?如果不是-那就是你的暗示。文件生成不被缓存(写入是,但文件必须存在才能打开流)。文件不存在...

System.IO.FileNotFoundException

这意味着文件有问题。所以,你认为你的程序想要打开一个输入文件,或者一个输出文件,...,或者你的日志文件,这也可能是一个文件,导致了那个异常。

但还有另一种文件:DLLs!!!

事情是这样的:我正在使用 NuGet 包。由于我在使用 NuGet Restore 时遇到问题,我决定直接参考 DLL 文件,但由于我需要进行一些升级,所以升级也必须在目标环境中完成,我完全忘了。
当应用程序崩溃时,是否调试应用程序是一个问题。按下那个按钮,我终于看到了丢失的文件。

只是一个很小的问题:显然,丢失的文件是已知的。 是否可以在事件日志中包含该文件的名称?我想这对很多人来说可能非常有用!