пользовательское исключение c ++ / cli - стандартные конструкторы - PullRequest
2 голосов
/ 08 декабря 2011

Попытка избежать предупреждения FxCop «Не вызывать зарезервированные исключения» из библиотеки C ++ / CLI, поэтому я решил разбить и написать свой собственный тип исключения.

[Serializable]
public ref class CaptureException : public Exception
{
public:
    CaptureException() : Exception() {}
    CaptureException(String^ message) : Exception(message) {}
    CaptureException(String^ message, Exception^ inner) : Exception(message, inner) {}
protected:
    CaptureException(System::Runtime::Serialization::SerializationInfo^ info, System::Runtime::Serialization::StreamingContext^ context) : Exception(info, context) {}
};

Это не компилируется с указанием

error C2664: 'System::Exception::Exception(System::String ^,System::Exception ^)' : cannot convert parameter 1 from 'System::Runtime::Serialization::SerializationInfo ^' to 'System::String ^'

Я не уверен, почему я получаю эту ошибку. Разве у C ++ / CLI нет полного класса исключений? Я просто пытаюсь реализовать стандартные конструкторы для моего исключения, и в C # это выглядит так и прекрасно компилируется.

[Serializable]
public class CaptureException : Exception
{
    public DatabaseConnectionException() { }
    public CaptureException (string message) : base(message) { }
    public CaptureException (string message, Exception inner) : base(message, inner) { }
    protected CaptureException (
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}

1 Ответ

8 голосов
/ 08 декабря 2011

StreamingContext является типом значения (то есть структурой), поэтому вы захотите удалить шляпу ^:

    CaptureException(System::Runtime::Serialization::SerializationInfo^ info, System::Runtime::Serialization::StreamingContext context) : Exception(info, context) 
{} 
...