Бросок исключений часто следует следующему шаблону:
if(condition) { throw exception; }
вы проверяете условие, и если условие удовлетворяется, вы бросаете исключение.Итак, мне было интересно, если это хорошая идея написать статический класс для него, который может выглядеть следующим образом:
public static class Throw
{
public static void IfNullOrEmpty<T>(string @string, params object[] parameters) where T : Exception
{
Throw.If<T>(string.IsNullOrEmpty(@string), parameters);
}
public static void IfNullOrEmpty<T, I>(IEnumerable<I> enumerable, params object[] parameters) where T : Exception
{
Throw.If<T>(enumerable == null || enumerable.Count() == 0, parameters);
}
public static void IfNullOrEmpty(string @string, string argumentName)
{
Throw.IfNullOrEmpty(@string, argumentName,
string.Format("Argument '{0}' cannot be null or empty.", argumentName));
}
public static void IfNullOrEmpty(string @string, string argumentName, string message)
{
Throw.IfNullOrEmpty<ArgumentNullOrEmptyException>(@string, message, argumentName);
}
public static void IfNullOrEmpty<I>(IEnumerable<I> enumerable, string argumentName)
{
Throw.IfNullOrEmpty(enumerable, argumentName,
string.Format("Argument '{0}' cannot be null or empty.", argumentName));
}
public static void IfNullOrEmpty<I>(IEnumerable<I> enumerable, string argumentName, string message)
{
Throw.IfNullOrEmpty<ArgumentNullOrEmptyException, I>(enumerable, message, argumentName);
}
public static void IfNull<T>(object @object, params object[] parameters) where T : Exception
{
Throw.If<T>(@object == null, parameters);
}
public static void If<T>(bool condition, params object[] parameters) where T : Exception
{
if (condition)
{
var types = new List<Type>();
var args = new List<object>();
foreach (object p in parameters ?? Enumerable.Empty<object>())
{
types.Add(p.GetType());
args.Add(p);
}
var constructor = typeof(T).GetConstructor(types.ToArray());
var exception = constructor.Invoke(args.ToArray()) as T;
throw exception;
}
}
public static void IfNull(object @object, string argumentName)
{
Throw.IfNull<ArgumentNullException>(@object, argumentName);
}
}
(Примечание: ArgumentNullOrEmptyException
здесь не определено, но это в значительной степени то, чтоможно было бы ожидать.)
поэтому вместо того, чтобы постоянно писать что-то подобное
void SomeFunction(string someParameter)
{
if(string.IsNullOrEmpty(someParameter))
{
throw new ArgumentNullOrEmptyException("someParameter", "Argument 'someParameter' cannot be null or empty.");
}
}
я просто делаю
void SomeFunction(string someParameter)
{
Throw.IfNullOrEmpty(someParameter, "someParameter"); // not .IsNullOrEmpty
}
мне действительно нравится это, но так ли этохорошая практика?