// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Runtime.Serialization; namespace System { /// <summary> /// The exception that is thrown when one of the arguments provided to a method is not valid. /// </summary> [Serializable] [TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] public class ArgumentException : SystemException { private readonly string? _paramName; // Creates a new ArgumentException with its message // string set to the empty string. public ArgumentException() : base(SR.Arg_ArgumentException) { HResult = HResults.COR_E_ARGUMENT; } // Creates a new ArgumentException with its message // string set to message. // public ArgumentException(string? message) : base(message) { HResult = HResults.COR_E_ARGUMENT; } public ArgumentException(string? message, Exception? innerException) : base(message, innerException) { HResult = HResults.COR_E_ARGUMENT; } public ArgumentException(string? message, string? paramName, Exception? innerException) : base(message, innerException) { _paramName = paramName; HResult = HResults.COR_E_ARGUMENT; } public ArgumentException(string? message, string? paramName) : base(message) { _paramName = paramName; HResult = HResults.COR_E_ARGUMENT; } [Obsolete(Obsoletions.LegacyFormatterImplMessage, DiagnosticId = Obsoletions.LegacyFormatterImplDiagId, UrlFormat = Obsoletions.SharedUrlFormat)] [EditorBrowsable(EditorBrowsableState.Never)] protected ArgumentException(SerializationInfo info, StreamingContext context) : base(info, context) { _paramName = info.GetString("ParamName"); } [Obsolete(Obsoletions.LegacyFormatterImplMessage, DiagnosticId = Obsoletions.LegacyFormatterImplDiagId, UrlFormat = Obsoletions.SharedUrlFormat)] [EditorBrowsable(EditorBrowsableState.Never)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { base.GetObjectData(info, context); info.AddValue("ParamName", _paramName, typeof(string)); } public override string Message { get { SetMessageField(); string s = base.Message; if (!string.IsNullOrEmpty(_paramName)) { s += " " + SR.Format(SR.Arg_ParamName_Name, _paramName); } return s; } } private void SetMessageField() { if (_message == null && HResult == HResults.COR_E_ARGUMENT) { _message = SR.Arg_ArgumentException; } } public virtual string? ParamName => _paramName; /// <summary>Throws an exception if <paramref name="argument"/> is null or empty.</summary> /// <param name="argument">The string argument to validate as non-null and non-empty.</param> /// <param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param> /// <exception cref="ArgumentNullException"><paramref name="argument"/> is null.</exception> /// <exception cref="ArgumentException"><paramref name="argument"/> is empty.</exception> public static void ThrowIfNullOrEmpty([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null) { if (string.IsNullOrEmpty(argument)) { ThrowNullOrEmptyException(argument, paramName); } } /// <summary>Throws an exception if <paramref name="argument"/> is null, empty, or consists only of white-space characters.</summary> /// <param name="argument">The string argument to validate.</param> /// <param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param> /// <exception cref="ArgumentNullException"><paramref name="argument"/> is null.</exception> /// <exception cref="ArgumentException"><paramref name="argument"/> is empty or consists only of white-space characters.</exception> public static void ThrowIfNullOrWhiteSpace([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string? paramName = null) { if (string.IsNullOrWhiteSpace(argument)) { ThrowNullOrWhiteSpaceException(argument, paramName); } } [DoesNotReturn] private static void ThrowNullOrEmptyException(string? argument, string? paramName) { ArgumentNullException.ThrowIfNull(argument, paramName); throw new ArgumentException(SR.Argument_EmptyString, paramName); } [DoesNotReturn] private static void ThrowNullOrWhiteSpaceException(string? argument, string? paramName) { ArgumentNullException.ThrowIfNull(argument, paramName); throw new ArgumentException(SR.Argument_EmptyOrWhiteSpaceString, paramName); } } }