2017-10-10 175 views
3

我使用這行代碼的錯誤處理的:獲取文件名,而不是控制器的名稱

 catch (Exception exception) 
     { 
string controllerAction = [email protected]"{ControllerContext.RouteData.Values["controller"].ToString()}Controller/{ControllerContext.RouteData.Values["action"].ToString()}"; 
     iCommCommon.CommWeb.WriteLog("<ERR>", CommUser.piUSER_KEY, controllerAction, exception.Message + "\n" + (exception.InnerException != null ? exception.InnerException.Message : "")); 
     } 

字符串controllerAction給我控制器名稱/動作名稱。

我想保存控制器的文件名,而不是控制器名稱。

因此,而不是:

HomeController 

我想記錄:

HomeController.cs 

而且已經controllerAction返回類似:

HomeController.cs/MyAction 

這可能嗎?

+0

您可以使用反射來查詢調用堆棧,並從中獲取詳細信息 – DiskJunky

+0

也許您有代碼示例? – FrenkyB

+1

查看此答案的詳細信息。我強烈建議使用編譯時間屬性,因爲有時堆棧跟蹤將成爲內聯的受害者。 https://stackoverflow.com/questions/31518803/get-the-filename-from-stacktrace-and-frame-when-throw-an-exception – Gusdor

回答

3

最好的方法要做到這一點是使用.NET 4.0中添加的編譯器服務屬性。

public void Log([CallerFilePath]string path="",[CallerLineNumber]int lineNumber=0,[CallerMemberName] string memberName="") 
{ 
    Console.WriteLine(path + " " + lineNumber + " " + memberName); 
} 

無恥地從這個答案中被盜。 Upvote它! Get the filename from stacktrace and frame when throw an exception

我強烈建議您在需要從當前幀中提取信息時使用這些屬性。偶爾,運行時會'在線調用更小的方法來提高性能。屬性受到最大的影響。這些屬性在編譯時注入信息,所以即使調用內聯,信息也會保留。

+1

如果你要「無恥地竊取」另一個答案,爲什麼不選擇作爲一個愚蠢的關閉? – DavidG

+0

主要是因爲我添加了比鏈接答案更多的信息。在SO上提取其他答案的片段有很多優先級。如果你不喜歡它,請降低或標記它。 – Gusdor

+0

然後在其他問題上添加詳細信息,而不是在這裏。 – DavidG

1

一個簡單的方法,我可以想像只是通過附加「的.cs」既然你已經附加字控制器一樣,

public string getFormattedRoute() 
    { 
     StringBuilder _strBldUri = new StringBuilder(); 
     _strBldUri.Clear(); 
     _strBldUri.Append(ControllerContext.RouteData.Values["controller"]); 
     _strBldUri.Append("Controller"); 
     _strBldUri.Append(".cs/"); 
     _strBldUri.Append(ControllerContext.RouteData.Values["action"]); 
     return _strBldUri.ToString(); 
    } 

並使用它像

catch (Exception exception) 
    { 
     string controllerAction = getFormattedRoute(); 
     iCommCommon.CommWeb.WriteLog("<ERR>", CommUser.piUSER_KEY, controllerAction, exception.Message + "\n" + (exception.InnerException != null ? exception.InnerException.Message : "")); 
    } 
+1

這不能保證工作,文件名不一定匹配類名稱。 – DavidG

+0

我不明白這個情況。由於他在談論從路線數據中獲取控制器名稱,有沒有一種情況下控制器將處於不是類的文件中?或者你是指一種更一般的方法? I –

+0

我在說這是一個約定,一個類在名稱匹配的文件中,但事實並非總是如此。例如,部分類如何? – DavidG

相關問題