试试主要方法的捕获扩展?

时间:2018-06-05 05:47:53

标签: c# exception logging try-catch

我有这个Logger类:

public static class Logger
{
    public static void LogError(Exception e)
    {

    }

    public static void TryCatchLogError<T>(this T item, Action action)
    {
        try
        {
            action();
        }
        catch (Exception ex)
        {
            LogError(ex);
        }
    }
}

我可以这样做:

public partial class Form1 : Form
{
    public void GetBreakDownMachine()=>  this.TryCatchLogError(() =>
    {
        {
            //my code
        }
    });
}

但在我的静态主类

中不能做同样的事情
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()=>  this.TryCatchLogError(() =>
    {
        {
            //my code
        }
    });
}

如何使用上述静态方法的Logger扩展类?

2 个答案:

答案 0 :(得分:0)

您可以将类的主方法设为Expression Bodied Member,就像这样(至少对于控制台应用程序)

private static void Main(string[] args) => Console.WriteLine("asdasd");

然而,这是相当丑陋的,我永远不会亲自去做。整个 Expression try catch 也不适合我。它只是额外调用堆栈来玷污你的堆栈跟踪,最糟糕的是你没有处理异常而只是使用毯子捕获。

我会重新考虑这两种方法

如果你真的想要走下这个兔子洞,你需要传递T物品

public static void TryCatchLogError<T>(this T item, Action action)
{
   try
   {
      action();
   }
   catch (Exception ex)
   {
     // LogError(ex);
   }
}

private static void Main() => 
   TryCatchLogError("asd",  // <== here needs to be T Item
      () =>
         {
            Console.WriteLine("asdasd");
         });

答案 1 :(得分:0)

您的方法需要“项目”,但Main不提供。 Main中没有'this'。