簡體   English   中英

只需一次try-catch即可捕獲應用程序中的所有異常

[英]catch all exceptions in the application with just one try-catch

有什么方法可以通過一次try-catch在Main()上捕獲應用程序中所有異常,而與應用程序中的線程和應用程序域無關嗎?

換句話說,我只想使用一個try-catch來記錄應用程序中的所有錯誤,而不是在各個地方使用多個try-catch。

將不勝感激任何想法或代碼片段...

編輯:我正在使用控制台應用程序和Windows服務。

有什么方法可以通過一次try-catch在Main()上捕獲應用程序中所有異常,而與應用程序中的線程和應用程序域無關嗎?

不,每個線程都有異常,因此,除非您采取措施將其他線程中的異常封送給您的主線程,否則無法捕獲其他線程中的異常。

例如,如果您異步調用委托,則需要調用EndInvoke才能將任何異常返回給調用線程。 如果您只是啟動線程而沒有執行任何處理或封送異常的操作,則未處理的異常將導致運行時關閉應用程序。

我懷疑有一個共同的地方記錄錯誤是否有用。

您想通過代碼縮減實現什么?

映像一個名為InvalidFileFormatException的異常,每當您嘗試打開格式不符合預期的文件時,該異常都可能在應用程序中發生。 全局異常處理程序可以記錄此。 然后,您的日志文件將讀取如下內容:

[Yesterday...] The file format is invalid: InvalidFileFormatException. StackTrace: ...

但是您將從這些信息中獲得什么? 好的,我承認,如果整個應用程序中只有一個調用會導致引發此異常,則一切正常。 但是,如果有多個調用相同的方法或其他被調用的方法引發相同的異常怎么辦?

您必須依靠Exception的詳細消息,但是不幸的是,如果涉及運行時引發的Exception,則不能影響該消息。 有這樣的東西不是更好嗎

string fileName = @"C:\Users\stackoverflow\Documents\file.frk";

try
{
  FreakingObject fo = freakingObjectConverter.ReadFromFile(fileName, FreakFormat.AutoDetect);
}
catch (InvalidFileFormatException iffe)
{
  MyLogger.LogError("File " + fileName + " had an invalid format:", iffe);
}

在示例中,您至少獲得有關格式錯誤的文件的信息。 您可以輕松地創建更復雜的示例(HttpRequest等),如果您僅知道拋出異常的上下文,則可以在其中向日志添加非常有用的信息。

關於Application.Run(...)的try-catch的小提示:請記住,只要不到達主窗體或執行其他任何操作,只要到達catch塊,應用程序就會退出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM