2017-12-28 24 views
0

例外が発生したクラスからClassとMethodNameを取得しようとしています。以下のコードを参照してください:例外から不正なクラスとメソッド名を取得する

[MethodImpl(MethodImplOptions.NoInlining)] 
    public void Log(object obj, LogTypes logType, int userId = 0, string userName = "", [CallerFilePath] string sourceFilePath = "",[CallerMemberName] string methodName = "") 
    { 
     var appLog = new ApplicationLog(); 
     try 
     { 
      appLog.UserId = userId; 
      appLog.UserName = userName; 
      appLog.InstanceName = ConfigurationSettingsHelper.InstanceName; 
      appLog.ProjectName = HostingEnvironment.IsHosted ? HostingEnvironment.ApplicationHost.GetSiteName() : Assembly.GetCallingAssembly().GetName().Name; 
      appLog.LoggedOn = DateTime.UtcNow; 
      appLog.FilePath = sourceFilePath; 
      if (logType==LogTypes.Exception) 
      { 
       if (obj is Exception ex) 
       { 
        appLog.LogType = 1; 
        appLog.LogDetails = ex.ToString(); 
        if (ex.TargetSite.DeclaringType != null) 
         appLog.ClassName = ex.TargetSite.DeclaringType.FullName; 
        appLog.MethodName = ex.TargetSite.Name; 
        appLog.Message = ex.Message; 
       } 
      } 
      else 
      { 
       appLog.LogType = 2; 
       var reflectedType = new StackFrame(1).GetMethod().ReflectedType; 
       if (reflectedType != null) 
        appLog.ClassName = reflectedType.FullName; 
       appLog.MethodName = methodName; 
       appLog.LogDetails = obj is string ? obj.ToString() : "NA-Not a valid logging."; 
      } 
     } 
     catch (Exception ex) 
     { 
      //In case of unhandled exceptions.Try logging internal exception once. 
      //If failed, pass by silently. 
      try 
      { 
       appLog = new ApplicationLog 
       { 
        UserId = userId, 
        UserName = userName, 
        FilePath = new StackFrame(1).GetFileName(), 
        Message = ex.Message, 
        InstanceName = ConfigurationSettingsHelper.InstanceName, 
        ProjectName = Assembly.GetCallingAssembly().GetName().Name, 
        LoggedOn = DateTime.UtcNow, 
        LogType = 1, 
        LogDetails = ex.ToString() 
       }; 
       if (ex.TargetSite.DeclaringType != null) 
        appLog.ClassName = ex.TargetSite.DeclaringType.FullName; 
       appLog.MethodName = ex.TargetSite.Name; 
      } 
      finally 
      { 
       HttpWebMethods.PostAsync(ConfigurationSettingsHelper.LoggerApiBaseAddress, 
        ConfigurationSettingsHelper.SaveLogEndpoint, appLog); 
      } // intentionally eating exception} 
     } 
     finally 
     { 
      HttpWebMethods.PostAsync(ConfigurationSettingsHelper.LoggerApiBaseAddress, 
       ConfigurationSettingsHelper.SaveLogEndpoint, appLog); 
     } 
    } 

しかし、上記のコードは、間違ったクラスとメソッド名をキャプチャしています。以下の例外を参照してください。

System.FormatException: Input string was not in a correct format. 
    at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.Convert.ToInt32(String value) 
    at Common.ConvertAIToPNG.DAMFileOperation(String fsGUIDFolder, Int32 fiUserID, String fsInputFileName, String& fsOutPutFileName) 
    in c:\Main\PDM\App_code\common\ConvertAIToPNG.cs:line 70 
    at DAMFilesUploader.UploadFile(HttpContext context) in c:\Main\PDM\Uploader\DAMFilesUploader.ashx:line 82 

私は、発生したクラス名とメソッド名とともにこの例外をキャプチャしてロギングしています。しかし、ここで私は得ています

クラス:System.Number |方法:StringToNumber クラスでなければなりません期待一方

、:ConvertAIToPNG方法:DAMFileOperation

私は知っていた、私はホイールを再発明しています。 Log4Net/Elmahを使うことができます。しかし、まだ、私は理由/解決策を把握したい。 また、WebApp/Windowsアプリではなく、WEBSITEでこのコードを使用しています。。しかし、私はすべてのケースを考慮し、より一般的にしようとしました。

ありがとうございました。

答えて

0

ありがとうございました。それは簡単な修正でした。

この

var methodBase = new StackFrame(1).GetMethod(); 
    appLog.ClassName = methodBase.DeclaringType. FullName; 
    appLog.MethodName = methodBase.Name; 

if (ex.TargetSite.DeclaringType != null) 
    appLog.ClassName = ex.TargetSite.DeclaringType.FullName; 
    appLog.MethodName = ex.TargetSite.Name; 

を置き換え

関連する問題