1

I'm not understanding the compile errors I'm getting when I try to set the following constructor for a custom exceptions class:

[Serializable]
        class AuthenticationException : Exception
        {
            public int PracticeID { get; set; }

            public AuthenticationException()
                : base() { }

            public AuthenticationException(string message)
                : base(message) { }

            public AuthenticationException(string message, Exception InnerException)
                : base(message, InnerException) { }

            public AuthenticationException(SerializationInfo info, StreamingContext context) 
                : base(info, context) { }

            public  AuthenticationException(int PracticeID)
                : base(PracticeID)
            {
                this.PracticeID = PracticeID;
            }
        }

The errors I'm getting are as follows:

The best overloaded method match for 'System.Exception.Exception(string)' has some invalid arguments

&

cannot convert from 'int' to 'string'

Both are occurring at the : base(PracticeID) portion of the class.

I don't understand why it's looking for a string here.

I tried searching for an answer and cam upon these two previously asked questions

Custom exception with properties

What is the correct way to make a custom .NET Exception serializable?

I'm not sure what I'm doing differently from the first one that is causing the errors, and I tried reading/ replicating the second but I got completely lost.

This exception would occur in an inner loop, and I would like to have a customer error catch block on outer loop that deals with this particular situation.

I figure a workaround is just to use the Data property of the exception class and in the catch block of the outer loop check if there's a key for an item named something like "Authenticate" and handle the exception there.

I don't want to do that though because that sort exception handling is what custom exception classes are meant to do.

W.Harr
  • 303
  • 1
  • 4
  • 15
  • 2
    The issue is the final constrructor wich accepts a Int. Exception does not have a constructor that accepts a int, so base(int) can not be resolved in any sensible way. If you want custom proeprties, you do *not* send them to the base classs. Those are part of your custom code. – Christopher May 14 '18 at 21:43
  • You're calling `base(PracticeID)` in that constructor. Does the `Exception` class contain a constructor that takes just an `int`? – Chris Dunaway May 14 '18 at 21:44

1 Answers1

2

The base exception class doesn't have a matching constructor.

Instead, change your code to call the empty constructor (option A), or maybe use the id to provide a default error message (option B):

[Serializable]
class AuthenticationException : Exception
{
    public int PracticeId { get; }

        // Other constructors

    // Option A
    public AuthenticationException(int practiceId)
        : base()
    {
        PracticeId = practiceId;
    }

    // Option B
    public AuthenticationException(int practiceId)
        : base("Invalid id: " + practiceId)
    {
        PracticeId = practiceId;
    }
}
Evan Trimboli
  • 29,900
  • 6
  • 45
  • 66