【问题标题】:Try Catch Extension For the Main Method?尝试对 Main 方法进行 Catch 扩展?
【发布时间】:2018-11-14 12:17:57
【问题描述】:

我有这个 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 扩展类?

【问题讨论】:

  • "item" 参数是引发异常的对象。我在这里删除了它的用法,因为它包含敏感内容。
  • [STAThread] static void Main() =&gt; Logger.TryCatchLogError&lt;Program&gt;(null, () =&gt; { Console.WriteLine("bob"); }); 您不能在 static 方法的上下文中使用 this.,因为它没有意义 - 没有实例可言。
  • 多么愚蠢,我错过了为班级删除静态。我又坏了。我以前也尝试过你的建议,但正如所说,错过了让课程成为非静态的。它现在有效,现在我也明白了@theGeneral 的答案。谢谢

标签: c# exception logging try-catch


【解决方案1】:

您可以将类的主要方法设为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");
         });

【讨论】:

  • 我明白你在说什么,但出于战略目的,我需要使用帖子中提到的 Logger 扩展(我们正在试验一些设计原则)。
  • 您的解决方案有效,但来自 cmets 中 @mjwills 的建议有点适合我的情况。但是,如果我的班级由于某种原因必须保持静止,那么您的解决方案就是要走的路。谢谢。
【解决方案2】:

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

【讨论】:

  • 明白了,有没有办法可以将我的 Logger 扩展用于 Main 方法?。
  • 它需要一个项目。如果你有,你可以调用 myItem.TryCatchLogError(..) 而不是 this.TruCatchLogError。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多