覆盖异常类和处理错误而不引用类引用

时间:2017-11-20 09:43:31

标签: c# exception-handling

我想在一个地方处理所有错误而不引用该类。

查看我目前的结构。

public ActionResult Login(string returnUrl)
{
    try
    {
        var a = 10;
        var b = 0;
        var c = a / b;
    }
    catch (Exception ex)
    {
        throw new LogEroor("", ex);
    }

    ViewBag.ReturnUrl = returnUrl;
    return View();
}

和我的错误处理类。

public class LogEroor : Exception
{
    public LogEroor(string message, Exception Ex) : base(message, Ex)
    {
        // error handling
    }
}
  

我的问题

有什么办法可以在发生错误时使用Ex参数调用LogError方法,但我不想在每个捕获中调用此方法,如我在这做了。

2 个答案:

答案 0 :(得分:4)

这是典型的XY problem。您试图解决的实际问题是,解释:

  

我想记录我的Web应用程序中发生的所有异常。

你的解决方案Y是,转述:

  

我将从Exception继承,我将在其中进行日志记录,并希望将任何抛出的异常转换为我的异常类型,以便可以记录它,而无需在所有可以异常的地方编写try-catch块发生。

现在你想要问题Y的帮助,但这完全是错误的做法。你可以使用AppDomain.UnhandledException event来做,但你不应该。

您的解决方案位于How do I log ALL exceptions globally for a C# MVC4 WebAPI app?:使用例外过滤器。

答案 1 :(得分:1)

您如何在未指定方法的情况下调用方法甚至构造函数?你想要什么根本没有意义,当然你的所有类都必须引用泛型异常类,如果它们是 throw 那么。

您可以注册AppDomain.UnhandledExceptionHandler,但这是所有处理的异常的通用处理程序。因此,不是通过包装来捕获所有异常并再次抛出它们,而是可以使用它:

AppDomain.UnhandledExceptionHandler += (sender, args) => { throw new LogError(args.ExceptionObject); };

但是这样你就会在应用程序的异常处理的最后一层中抛出一个异常。这意味着您抛出一个永远不会被捕获的异常并且会使您的应用程序崩溃。为避免这种情况,请直接在该事件中实现日志记录。