1
0
mirror of https://github.com/oliverbooth/X10D synced 2024-11-23 00:38:47 +00:00

🔨 Improve exception handling and rethrowing

This commit is contained in:
Oliver Booth 2020-04-18 14:34:42 +01:00
parent 373313f07e
commit 11bc2415fc
No known key found for this signature in database
GPG Key ID: 0D7F2EF1C8D2B9C0
5 changed files with 106 additions and 16 deletions

View File

@ -97,10 +97,17 @@
/// <param name="bytes">The bytes to convert.</param> /// <param name="bytes">The bytes to convert.</param>
/// <param name="encoding">The encoding to use.</param> /// <param name="encoding">The encoding to use.</param>
/// <returns>Returns a <see cref="string"/>.</returns> /// <returns>Returns a <see cref="string"/>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="encoding"/> is <see langword="null"/>.</exception>
public static string GetString(this IEnumerable<byte> bytes, Encoding encoding) public static string GetString(this IEnumerable<byte> bytes, Encoding encoding)
{ {
IEnumerable<byte> enumerable = bytes as byte[] ?? bytes.ToArray(); if (encoding is null)
return encoding.GetString(enumerable.ToArray(), 0, enumerable.Count()); {
throw new ArgumentNullException(nameof(encoding));
}
// ReSharper disable once SuggestVarOrType_Elsewhere
var array = bytes.ToArray();
return encoding.GetString(array, 0, array.Length);
} }
} }
} }

View File

@ -28,12 +28,23 @@
/// <param name="length">The length of the string to generate.</param> /// <param name="length">The length of the string to generate.</param>
/// <param name="random">The <see cref="System.Random"/> instance.</param> /// <param name="random">The <see cref="System.Random"/> instance.</param>
/// <returns>Returns a <see cref="string"/> containing <paramref name="length"/> characters.</returns> /// <returns>Returns a <see cref="string"/> containing <paramref name="length"/> characters.</returns>
/// <exception cref="ArgumentNullException"><paramref name="random"/> is <see langword="null"/>.</exception>
public static string Random(this char[] chars, int length, Random random) public static string Random(this char[] chars, int length, Random random)
{ {
StringBuilder builder = new StringBuilder(length); if (chars is null)
for (int i = 0; i < length; i++)
{ {
builder.Append(chars.ElementAt(random.Next(0, chars.Length))); throw new ArgumentNullException(nameof(chars));
}
if (random is null)
{
throw new ArgumentNullException(nameof(random));
}
var builder = new StringBuilder(length);
for (var i = 0; i < length; i++)
{
builder.Append(chars[random.Next(0, chars.Length)]);
} }
return builder.ToString(); return builder.ToString();

View File

@ -52,8 +52,20 @@
/// <param name="random">The <see cref="System.Random"/> instance.</param> /// <param name="random">The <see cref="System.Random"/> instance.</param>
/// <param name="source">The collection from which to draw.</param> /// <param name="source">The collection from which to draw.</param>
/// <returns>Returns a random element of type <see cref="T"/> from <paramref name="source"/>.</returns> /// <returns>Returns a random element of type <see cref="T"/> from <paramref name="source"/>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="random"/> or <paramref name="source"/> is
/// <see langword="null"/>.</exception>
public static T OneOf<T>(this Random random, IList<T> source) public static T OneOf<T>(this Random random, IList<T> source)
{ {
if (random is null)
{
throw new ArgumentNullException(nameof(random));
}
if (source is null)
{
throw new ArgumentNullException(nameof(source));
}
return source[random.Next(source.Count)]; return source[random.Next(source.Count)];
} }
} }

View File

@ -16,10 +16,17 @@
/// <typeparam name="T">A <see cref="HashAlgorithm"/> derived type.</typeparam> /// <typeparam name="T">A <see cref="HashAlgorithm"/> derived type.</typeparam>
/// <param name="stream">The stream whose hash is to be computed.</param> /// <param name="stream">The stream whose hash is to be computed.</param>
/// <returns>Returns a <see cref="byte"/> array representing the hash of the stream.</returns> /// <returns>Returns a <see cref="byte"/> array representing the hash of the stream.</returns>
public static byte[] GetHash<T>(this Stream stream) where T : HashAlgorithm /// <exception cref="ArgumentNullException"><paramref name="stream"/> is <see langword="null"/>.</exception>
public static byte[] GetHash<T>(this Stream stream)
where T : HashAlgorithm
{ {
if (stream is null)
{
throw new ArgumentNullException(nameof(stream));
}
MethodInfo create = typeof(T).GetMethod("Create", Array.Empty<Type>()); MethodInfo create = typeof(T).GetMethod("Create", Array.Empty<Type>());
using T crypt = (T)create?.Invoke(null, null); using var crypt = (T)create?.Invoke(null, null);
return crypt?.ComputeHash(stream); return crypt?.ComputeHash(stream);
} }
} }

View File

@ -52,7 +52,7 @@
/// <returns>The <see cref="Enum"/> value corresponding to the <see cref="string"/></returns> /// <returns>The <see cref="Enum"/> value corresponding to the <see cref="string"/></returns>
public static T EnumParse<T>(this string value, bool ignoreCase) public static T EnumParse<T>(this string value, bool ignoreCase)
{ {
if (value == null) if (value is null)
{ {
throw new ArgumentNullException(nameof(value)); throw new ArgumentNullException(nameof(value));
} }
@ -61,18 +61,17 @@
if (value.Length == 0) if (value.Length == 0)
{ {
throw new ArgumentException("Must specify valid information for parsing in the string.", throw new ArgumentException("Must specify valid information for parsing in the string.", nameof(value));
nameof(value));
} }
Type t = typeof(T); Type t = typeof(T);
if (!t.IsEnum) if (!t.IsEnum)
{ {
throw new ArgumentException("Type provided must be an Enum.", nameof(T)); throw new ArgumentException("Type provided must be an Enum.");
} }
return (T) Enum.Parse(t, value, ignoreCase); return (T)Enum.Parse(t, value, ignoreCase);
} }
/// <summary> /// <summary>
@ -92,8 +91,20 @@
/// <param name="str">The string to convert.</param> /// <param name="str">The string to convert.</param>
/// <param name="encoding">The encoding to use.</param> /// <param name="encoding">The encoding to use.</param>
/// <returns>Returns a <see cref="byte"/>[].</returns> /// <returns>Returns a <see cref="byte"/>[].</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> or <paramref name="encoding"/> or both are
/// <see langword="null"/>.</exception>
public static byte[] GetBytes(this string str, Encoding encoding) public static byte[] GetBytes(this string str, Encoding encoding)
{ {
if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
if (encoding is null)
{
throw new ArgumentNullException(nameof(encoding));
}
return encoding.GetBytes(str); return encoding.GetBytes(str);
} }
@ -115,8 +126,14 @@
/// <param name="length">The length of the string to generate.</param> /// <param name="length">The length of the string to generate.</param>
/// <param name="random">The <see cref="System.Random"/> instance.</param> /// <param name="random">The <see cref="System.Random"/> instance.</param>
/// <returns>Returns a <see cref="string"/> containing <paramref name="length"/> characters.</returns> /// <returns>Returns a <see cref="string"/> containing <paramref name="length"/> characters.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static string Random(this string str, int length, Random random) public static string Random(this string str, int length, Random random)
{ {
if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
return str.ToCharArray().Random(length, random); return str.ToCharArray().Random(length, random);
} }
@ -127,11 +144,17 @@
/// <param name="count">The repeat count.</param> /// <param name="count">The repeat count.</param>
/// <returns>Returns a <see cref="string"/> whose value is <paramref name="str"/> repeated /// <returns>Returns a <see cref="string"/> whose value is <paramref name="str"/> repeated
/// <paramref name="count"/> times.</returns> /// <paramref name="count"/> times.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static string Repeat(this string str, int count) public static string Repeat(this string str, int count)
{ {
StringBuilder builder = new StringBuilder(str.Length * count); if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
for (int i = 0; i < count; i++) var builder = new StringBuilder(str.Length * count);
for (var i = 0; i < count; i++)
{ {
builder.Append(str); builder.Append(str);
} }
@ -155,8 +178,14 @@
/// <param name="str">The string to shuffle.</param> /// <param name="str">The string to shuffle.</param>
/// <param name="random">The <see cref="System.Random"/> instance.</param> /// <param name="random">The <see cref="System.Random"/> instance.</param>
/// <returns>Returns a <see cref="string"/> containing the characters in <paramref name="str"/>, rearranged.</returns> /// <returns>Returns a <see cref="string"/> containing the characters in <paramref name="str"/>, rearranged.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static string Shuffle(this string str, Random random) public static string Shuffle(this string str, Random random)
{ {
if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
return new string(str.ToCharArray().Shuffle(random).ToArray()); return new string(str.ToCharArray().Shuffle(random).ToArray());
} }
@ -167,9 +196,15 @@
/// <param name="chunkSize">The maximum length of each string in the returned result.</param> /// <param name="chunkSize">The maximum length of each string in the returned result.</param>
/// <returns>Returns an <see cref="IEnumerable{T}"/> containing <see cref="string"/> instances which are no /// <returns>Returns an <see cref="IEnumerable{T}"/> containing <see cref="string"/> instances which are no
/// greater than <paramref name="chunkSize"/> in length.</returns> /// greater than <paramref name="chunkSize"/> in length.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static IEnumerable<string> Split(this string str, int chunkSize) public static IEnumerable<string> Split(this string str, int chunkSize)
{ {
for (int i = 0; i < str.Length; i += chunkSize) if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
for (var i = 0; i < str.Length; i += chunkSize)
{ {
yield return str.Substring(i, Math.Min(chunkSize, str.Length - i)); yield return str.Substring(i, Math.Min(chunkSize, str.Length - i));
} }
@ -180,8 +215,14 @@
/// </summary> /// </summary>
/// <param name="str">The string to convert.</param> /// <param name="str">The string to convert.</param>
/// <returns>Returns a <see cref="SecureString"/>.</returns> /// <returns>Returns a <see cref="SecureString"/>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static SecureString ToSecureString(this string str) public static SecureString ToSecureString(this string str)
{ {
if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
if (string.IsNullOrWhiteSpace(str)) if (string.IsNullOrWhiteSpace(str))
{ {
return null; return null;
@ -202,9 +243,15 @@
/// <param name="str">The <see cref="SecureString"/> to convert.</param> /// <param name="str">The <see cref="SecureString"/> to convert.</param>
/// <param name="extension">Whether or not to use this extension method.</param> /// <param name="extension">Whether or not to use this extension method.</param>
/// <returns>Returns a <see cref="string"/>.</returns> /// <returns>Returns a <see cref="string"/>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static string ToString(this SecureString str, bool extension) public static string ToString(this SecureString str, bool extension)
{ {
return extension ? (new NetworkCredential(string.Empty, str).Password) : str.ToString(); if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
return extension ? new NetworkCredential(string.Empty, str).Password : str.ToString();
} }
/// <summary> /// <summary>
@ -213,8 +260,14 @@
/// </summary> /// </summary>
/// <param name="str">The input string.</param> /// <param name="str">The input string.</param>
/// <returns>Returns an instance of <see cref="TimeSpan"/>.</returns> /// <returns>Returns an instance of <see cref="TimeSpan"/>.</returns>
/// <exception cref="ArgumentNullException"><paramref name="str"/> is <see langword="null"/>.</exception>
public static TimeSpan ToTimeSpan(this string str) public static TimeSpan ToTimeSpan(this string str)
{ {
if (str is null)
{
throw new ArgumentNullException(nameof(str));
}
return TimeSpanParser.Parse(str); return TimeSpanParser.Parse(str);
} }
} }