异常中的错误级别

时间:2014-02-11 07:31:53

标签: c# exception exception-handling

我使用IErrorHandler中的WCF REST处理错误。我需要记录类名,方法名,行号,错误代码等,并找出所有这些的灵魂。

但我正在考虑获得像Windows事件查看器这样的1ErrorLevel1的任何可能性或选项。例如:警告,信息,错误。

实际上,如果我这样做,我的applciation例外可以作为信息。这可以简单地创建一个自定义的Exception类。

  1. 但我的问题是针对其他异常(除了我的应用程序异常),根据错误获取此级别的任何选项。我不需要为其他类型的错误设置此级别。

  2. 实际上我正在HandleError事件中记录异常。现在我只是将异常作为applicationexception抛出。

  3. 请参阅下面的服务方法代码:

            if(!long.TryParse("534543534", out value))
            {
                throw new ApplicationException("Input is Not Valid!!!");
            }
    

    因此,在我的错误处理中,我将此作为应用程序异常。这里我不知道这是因为FormatException,溢出异常,ArgumentNullException。我怎么处理这个。我可以将原始异常添加为innerexception但需要在每个服务方法中包装try..catch以获取异常。当我使用IErrorHandler方法时这是一个好习惯。请为此建议好的方法

1 个答案:

答案 0 :(得分:0)

在.NET中,异常是一个严重错误,会中断应用程序的进程。该框架(大多数情况下)不提供错误级别,因为所有异常基本上都是错误。如果抛出异常,则始终表示存在应用程序无法继续的错误。

如果要识别异常类型并将某些异常类型作为信息性消息或警告写入日志,则必须检查错误处理程序中的异常,例如:通过与此类似的代码:

public class MyErrorHandler : IErrorHandler
{
    // ...
    private static readonly Dictionary<Type, TraceLevel> _exceptionTraceLevelMappings;

    static MyErrorHandler()
    {
        _exceptionTraceLevelMappings = new Dictionary<Type, TraceLevel>();
        _exceptionTraceLevelMappings.Add(typeof(ApplicationException), TraceLevel.Information);
        _exceptionTraceLevelMappings.Add(typeof(ArgumentException), TraceLevel.Warning);
    }

    private static TraceLevel GetLevelByExceptionType(Type exType)
    {
        // You might want to add a more sophisticated approach here (e.g. for base classes)
        if (_exceptionTraceLevelMappings.ContainsKey(exType))
            return _exceptionTraceLevelMappings[exType];
        return TraceLevel.Error;
    }

    // ...
}

根据评论,您希望识别引发编码错误的错误和输入数据验证错误。在这种情况下,您需要实现CustomException类型并使用TryParse来验证输入数据:

public class MyValidationException : Exception
{
    public MyValidationException(string message)
        : base(message)
    {
    }

    // A custom exceptions needs several constructors, so add them also
}

在您的服务代码中,您将使用样本中的TryParse:

if(!long.TryParse("534543534", out value))
{
    throw new MyValidationException("Input is Not Valid!!!");
}

在映射字典中,您可以注册您的异常类型并分配TraceLevel.Information:

// ...
_exceptionTraceLevelMappings.Add(typeof(MyValidationException), TraceLevel.Information);
// ...