Как получить доступ к свойству StackTrace из моих пользовательских исключений в ядре dot net - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь реализовать свои собственные исключения в ядре dot net.

Это то, что у меня есть:

public class WSException: Exception
{
    // some custom stuff...
    private readonly string _developerMessage = "";
    public string DeveloperMessage { get { return _developerMessage; } }

    public WSException() {}

    public WSException(string message) : base(message) {
        this._developerMessage = message;
    }

    public WSException(string message, Exception inner) : base(message, inner) {
        this._developerMessage = message;
    }

    public WSException(Exception ex) : base(ex.Message, ex.InnerException) {
        _developerMessage = ex.Message;
        Source = ex.Source;
        //StackTrace = ex.StackTrace;  // cannot be assigned to, it's read only
    }

    public WSException(string message) : base(message) {
        this._developerMessage = (String.IsNullOrWhiteSpace(developerMessage) ? message : developerMessage);
    }
}

Когда я ловлю общее исключение, я пытаюсьсоздать свой собственный (WSException), чтобы обрабатывать его обычным способом, например:

try {
    // whatever 
}
catch (WSException e) {
    HandleException(e);
}
catch (Exception e) {
    HandleException(new WSException(e));
}

Когда я делаю это таким образом, e.Source и e.StackTrace равны нулю, и когда япопытаться назначить StackTrace Я получаю Propery or indexer 'Exception.StackTrace' cannot be assigned to --it is read only.

Как я должен реализовать этот конструктор?

public WSException(Exception ex) : base(ex.Message, ex.InnerException) {
    _developerMessage = ex.Message;
    Source = ex.Source;
    //StackTrace = ex.StackTrace;  // cannot be assigned to, it's read only
}

1 Ответ

0 голосов
/ 22 мая 2018

Обходной путь, который я нашел до сих пор, состоит в том, чтобы справиться с ним, когда я сериализирую ошибку в json, что-то вроде этого:

public class WSExceptionJsonConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var ex = value as WSException;
        writer.WriteStartObject();

        // buch of properties[...]

        string stackTrace = null;
        if (ex.StackTrace != null) {
            stackTrace = ex.StackTrace;
        } else if (ex.InnerException != null && ex.InnerException.StackTrace != null) {
            stackTrace = ex.InnerException.StackTrace;
        } else {
            stackTrace = null;
        }
        writer.WritePropertyName("stacktrace");
        serializer.Serialize(writer, stackTrace.Split('\n'));

        writer.WriteEndObject();
    }

Но это кажется слишком хакерским

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...