编写异常辅助方法
Writing an exception helper method
我是 C# 的新手,正在练习抛出异常。从辅助方法中抛出异常以缩短所需代码量是一种好习惯吗?像这样:
public static void ThrowExcIfNull<T>(T[] array)
{
if (array == null) throw new ArgumentNullException("Array is null");
}
/// <summary>
/// Does Something
/// </summary>
/// <param name="x">The int array to be used</param>
/// <exception cref="ArgumentNullException">Thrown when the string is
/// null</exception> //Is this correct?
/// <returns>Some integer</returns>
public static int SomeMethod(this int[] x)
{
ThrowExcIfNull(x);
//Some code here
}
另外,写文档说“异常是从 someMethod 抛出的”可以吗?任何信息都会有所帮助!谢谢
我认为您应该改用以下模式:
using System;
public static class MyExtensions
{
/// <summary>
/// Magic method.
/// </summary>
/// <param name="source">
/// The source array.
/// </param>
/// <exception cref="ArgumentNullException">
/// <paramref name="source" /> is <c>null</c>.
/// </exception>
/// <returns>
/// Some magic value only you know about.
/// </returns>
public static int SomeMethod(this int[] source)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
return 42;
}
}
为什么?
- 您将
ThrowExcIfNull
作为扩展方法公开,说实话这很奇怪
- 如果您查看 https://referencesource.microsoft.com/#q=throwif,您会发现它们永远不会 public
- 除了
CancellationToken.ThrowIfCancellationRequested
但这是一个例外情况
如果你绝对想要这样的方法
至少传递参数名称以便于调试:
using System;
public static class MyExtensions
{
public static int SomeMethod(this int[] source)
{
ThrowIfNull(source, nameof(source));
return 42;
}
private static void ThrowIfNull(object value, string parameter)
{
if (value == null)
throw new ArgumentNullException(parameter);
}
}
但是现在你有另一个问题,堆栈跟踪中显示的第一个方法将是 ThrowExcIfNull
:
不使用辅助方法,只看区别:
crystal清楚错误的来源。
你可能会需要这个方法:
- 如果你在数百个地方使用它
- 如果要将消息翻译成用户的文化,例如中文
- 等等
我是 C# 的新手,正在练习抛出异常。从辅助方法中抛出异常以缩短所需代码量是一种好习惯吗?像这样:
public static void ThrowExcIfNull<T>(T[] array)
{
if (array == null) throw new ArgumentNullException("Array is null");
}
/// <summary>
/// Does Something
/// </summary>
/// <param name="x">The int array to be used</param>
/// <exception cref="ArgumentNullException">Thrown when the string is
/// null</exception> //Is this correct?
/// <returns>Some integer</returns>
public static int SomeMethod(this int[] x)
{
ThrowExcIfNull(x);
//Some code here
}
另外,写文档说“异常是从 someMethod 抛出的”可以吗?任何信息都会有所帮助!谢谢
我认为您应该改用以下模式:
using System;
public static class MyExtensions
{
/// <summary>
/// Magic method.
/// </summary>
/// <param name="source">
/// The source array.
/// </param>
/// <exception cref="ArgumentNullException">
/// <paramref name="source" /> is <c>null</c>.
/// </exception>
/// <returns>
/// Some magic value only you know about.
/// </returns>
public static int SomeMethod(this int[] source)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
return 42;
}
}
为什么?
- 您将
ThrowExcIfNull
作为扩展方法公开,说实话这很奇怪 - 如果您查看 https://referencesource.microsoft.com/#q=throwif,您会发现它们永远不会 public
- 除了
CancellationToken.ThrowIfCancellationRequested
但这是一个例外情况
如果你绝对想要这样的方法
至少传递参数名称以便于调试:
using System;
public static class MyExtensions
{
public static int SomeMethod(this int[] source)
{
ThrowIfNull(source, nameof(source));
return 42;
}
private static void ThrowIfNull(object value, string parameter)
{
if (value == null)
throw new ArgumentNullException(parameter);
}
}
但是现在你有另一个问题,堆栈跟踪中显示的第一个方法将是 ThrowExcIfNull
:
不使用辅助方法,只看区别:
crystal清楚错误的来源。
你可能会需要这个方法:
- 如果你在数百个地方使用它
- 如果要将消息翻译成用户的文化,例如中文
- 等等