我在 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 ...
我在這里有不同的問題:
- A
System.IO.FileNotFoundException,這是否意味著我的應用程式沒問題,嘗試打開一些不存在的外部檔案,或者它是否類似于 Java 行程,缺少*.class檔案? - 為什么 a
System.IO.FileNotFoundException沒有被我的try ... catch (Exception ex)子句捕獲? - 日志呢?我期待至少看到
ListOfWoodTypes()函式的第一行。這是否意味著NLog技術上存在一些緩沖,導致NLog日志記錄在崩潰時有一些延遲?
Edit1,無法除錯
我正在我自己的 PC 上開發這個程式,我在這里構建它,但我然后將可執行檔案復制到我客戶的 PC,所以除錯是不可能的。
uj5u.com熱心網友回復:
讓我開始 - 這并不像聽起來那么容易。正如他們所說,魔鬼在細節中......
System.IO.FileNotFoundException
這通常意味著有人扔了它。時期。有時會因為找不到檔案而拋出它,但我見過愚蠢的程式員濫用系統例外,或者“找不到檔案”有時被解釋得非常復雜(網路流可以使用檔案 api 打開)。因此,雖然這表明 - 您知道 - 未找到檔案,但不能 100% 確定這是觸發它的原因。
為什么我的 try ... catch (Exception ex) 子句沒有捕獲 System.IO.FileNotFoundException?
你告訴我們。它應該是 - 如果它被扔在里面。
您自己的代碼前后都有記錄器資訊。并且日志記錄可能會進入 - 猜猜是什么 - 一個檔案。假設第一行可能拋出錯誤并不是完全超現實的。
我們不能知道 - 你應該知道。當這個例外被拋出時,在除錯器中進行中斷。獲取它被拋出的確切位置。查看呼叫堆疊。看看屬性。例外通常包含額外的資料 - 訊息,可能是屬性。只是告訴我們細節就像“一輛奔馳墜毀,是什么錯誤”。除錯細節可能會回答您的所有問題。
日志呢?我期待至少看到 ListOfWoodTypes() 函式的第一行。
是的,除非那條線拋出例外。如果沒有日志檔案,我強烈建議 - 你知道 - 日志記錄是問題所在。
這是否意味著 NLog 技術中有一些緩沖,導致 NLog 日志記錄在崩潰時有一些延遲?
嗯,這項技術是“使用標準的 .NET 快取”……不使用它是完全愚蠢的。看,問題在于,如果您不快取,則需要大量的磁盤 IO,這可能會使日志記錄成為主要的性能消耗。你不能有這個。
但是:快取與否,檔案在那里?如果沒有 - 這就是你的意思。檔案生成不被快取(寫入是,但檔案必須在那里才能打開流)。檔案不在那里...
uj5u.com熱心網友回復:
System.IO.FileNotFoundException
System.IO.FileNotFoundException
SYSTEM.IO.FILENOTFOUNDEXCEPTION!!!
這意味著檔案有問題。所以,你認為你的程式想要打開一個輸入檔案,或一個輸出檔案,...,或者你的日志檔案,這也可能是一個檔案,導致該例外。
但還有另一種檔案:DLLs!!!
這就是發生的事情:我正在使用 NuGet 包。由于我有問題NuGet Restore,我決定DLL直接參考檔案,但由于我需要進行一些升級,因此升級也必須在目標環境中完成,我完全忘記了。
當應用程式崩潰時,存在是否要除錯應用程式的問題。按下那個按鈕終于讓我看到了丟失的檔案。
只是一個很小的問題:顯然,丟失的檔案是已知的。是否可以在事件日志中包含該檔案的名稱?我想這對很多人來說可能非常有用!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/379803.html
下一篇:java程式的索引越界錯誤
