Как я должен хранить данные в пользовательских исключениях?

Это работает, но не хорошо. Если Вы Google вокруг немного, Вы найдете порт, который использует MinGW. Основными проблемами является нестабильность и некоторые очень подобные Linux инструменты (gittk). При реальной необходимости в нем, хотя, необходимо быть в состоянии продвинуться.

5
задан adrianbanks 8 July 2009 в 10:29
поделиться

4 ответа

Я бы избегал использования данных, поскольку они не находятся под вашим контролем, например, какой-то код где-то может решить перезаписать значение "ErrorCode". Вместо этого используйте свойство и реализуйте сериализацию. Я использую следующий код для тестирования всех моих пользовательских исключений, чтобы убедиться, что я их правильно реализовал.

public static void TestCustomException<T>() where T : Exception
{
    var t = typeof(T);

    //Custom exceptions should have the following 3 constructors
    var e1 = (T)Activator.CreateInstance(t, null);

    const string message = "message";
    var e2 = (T)Activator.CreateInstance(t, message);
    Assert.AreEqual(message, e2.Message);

    var innerEx = new Exception("inner Exception");
    var e3 = (T)Activator.CreateInstance(t, message, innerEx);
    Assert.AreEqual(message, e3.Message);
    Assert.AreEqual(innerEx, e3.InnerException);

    //They should also be serializable
    var stream = new MemoryStream();
    var formatter = new BinaryFormatter();
    formatter.Serialize(stream, e3);
    stream.Flush();
    stream.Position = 0;
    var e4 = (T)formatter.Deserialize(stream);
    Assert.AreEqual(message, e4.Message);
    Assert.AreEqual(innerEx.ToString(), e4.InnerException.ToString());
}
1
ответ дан 14 December 2019 в 08:58
поделиться

Собственные рекомендации Microsoft :

Делайте исключения сериализуемыми. Исключение должно быть сериализуемым для правильной работы в домене приложения и границах удаленного взаимодействия.

Я бы сохранил его в свойстве Data, которое, к сожалению, позволило бы внешнему коду изменять значение без согласия, или использовать решение 1 (в вашем примере), но сделать он сериализуемый. В конце концов, я бы, вероятно, выбрал решение 1, чтобы быть уверенным, что значение никогда не изменится.

1
ответ дан 14 December 2019 в 08:58
поделиться

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

Если у вас есть собственный тип исключения, используйте вместо него свойства: это более чисто и безопасно.

0
ответ дан 14 December 2019 в 08:58
поделиться

Если вы пытаетесь создать собственное исключение, вам не нужно свойство Data. Данные полезны, когда вы хотите сохранить немного дополнительной информации в существующем классе исключений, но не хотите создавать свой собственный класс исключений.

5
ответ дан 14 December 2019 в 08:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: