代码之家  ›  专栏  ›  技术社区  ›  Dharani Kumar

尝试主方法的Catch扩展?

  •  -2
  • Dharani Kumar  · 技术社区  · 7 年前

    我有一门课:

    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 回复  |  直到 7 年前
        1
  •  0
  •   Ferdinand Swaters    7 年前

    你的方法需要一个“项”,但Main没有提供它。基本上没有“这个”。

        2
  •  0
  •   TheGeneral    7 年前

    你可以把一个类的主要方法 Expression Bodied Member ,就像这样(至少对于一个控制台应用程序)

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

    然而,这是相当丑陋的,我永远不会亲自这么做。还有整个 表情尝试捕捉 事情对我来说也不太好。这只是对堆栈的额外调用,以破坏堆栈跟踪,最糟糕的是,您没有处理异常,只是使用了一个覆盖式的catchall。

    我会重新考虑这两种方法

    如果你真的想进入这个兔子洞,你需要通过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");
             });