Это работает, но не хорошо. Если Вы Google вокруг немного, Вы найдете порт, который использует MinGW. Основными проблемами является нестабильность и некоторые очень подобные Linux инструменты (gittk). При реальной необходимости в нем, хотя, необходимо быть в состоянии продвинуться.
Я бы избегал использования данных, поскольку они не находятся под вашим контролем, например, какой-то код где-то может решить перезаписать значение "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());
}
Собственные рекомендации Microsoft :
Делайте исключения сериализуемыми. Исключение должно быть сериализуемым для правильной работы в домене приложения и границах удаленного взаимодействия.
Я бы сохранил его в свойстве Data, которое, к сожалению, позволило бы внешнему коду изменять значение без согласия, или использовать решение 1 (в вашем примере), но сделать он сериализуемый. В конце концов, я бы, вероятно, выбрал решение 1, чтобы быть уверенным, что значение никогда не изменится.
Вам следует использовать первое решение. Я не вижу особой ценности в свойстве Data, если вы не планируете создавать экземпляры исключений строк с прикрепленной информацией.
Если у вас есть собственный тип исключения, используйте вместо него свойства: это более чисто и безопасно.
Если вы пытаетесь создать собственное исключение, вам не нужно свойство Data. Данные полезны, когда вы хотите сохранить немного дополнительной информации в существующем классе исключений, но не хотите создавать свой собственный класс исключений.