Как я должен регистрировать дополнительные детали в webexception, мыльном исключении и т. Д.? - PullRequest
3 голосов
/ 16 августа 2011

В корпоративной библиотеке я не получал достаточного количества информации, помещаемой в мои журналы, поэтому я начал писать этот обработчик для извлечения специфических для исключения свойств и добавления их в строку сообщения:

[ConfigurationElementType(typeof(CustomHandlerData))]
public class ExposeDetailExceptionHandler : IExceptionHandler
{
    public Exception HandleException(Exception exception, Guid handlingInstanceId)
    {
        if (exception is System.Net.WebException) 
            return ExposeDetail((System.Net.WebException)exception);
        if (exception is System.Web.Services.Protocols.SoapException) 
            return ExposeDetail((System.Web.Services.Protocols.SoapException)exception);

        return exception;
    }

    private Exception ExposeDetail(System.Net.WebException Exception)
    {
        string details = "";
        details += "System.Net.WebException: " + Exception.Message + Environment.NewLine;
        details += "Status: " + Exception.Status.ToString() + Environment.NewLine;

        return new Exception(details, Exception);
    }

    private Exception ExposeDetail(System.Web.Services.Protocols.SoapException Exception)
    {
        //etc
    }
}

(Кроме того, есть ли лучший способ выбрать, какая версия ExposeDetail запускается?)

Это лучший или приемлемый способ для записи этих деталей, я изначально думал, что мне следует реализовать ExceptionFormatter, но это казалосьнамного проще

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Использование Exception.Data . Вы можете собрать любую дополнительную информацию, которую вы хотите зарегистрировать в тот момент, когда исключение было впервые обнаружено, и добавить их в Exception.Data. Вы также можете добавить другую информацию, которая не была частью исходного исключения, такую ​​как URL, заголовки http, ...

Ваш код регистрации исключений может затем взять Exception.Data и добавить всю эту информацию в журнал.

Вам не нужно оборачивать исключение, и при этом вы не должны терять ни одного стека вызовов. Используйте throw, чтобы перебросить исходное исключение, снова поймать его вверх по стеку, добавить больше контекста к .Data на нем и так далее, пока не дойдете до обработчика исключений.

1 голос
/ 09 сентября 2011

Я думаю, что вы правы: ExceptionFormatter, вероятно, лучший способ.

Я бы использовал расширенные свойства, чтобы добавить ваши данные. Я не думаю, что это сложнее, чем обработчик.

например:.

public class AppTextExceptionFormatter : TextExceptionFormatter
{
    public AppTextExceptionFormatter(TextWriter writer, 
             Exception exception, 
             Guid handlingInstanceId)
        : base (writer, exception, handlingInstanceId) 
    {
        if (exception is System.Net.WebException) 
        {
            AdditionalInfo.Add("Status", ((System.Net.WebException)exception).Status.ToString());
        }
        else if (exception is System.Web.Services.Protocols.SoapException)
        {
            AdditionalInfo.Add("Actor", ((SoapException)exception).Actor);
        } 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...