C# 我应该加入当前的方法还是让后面的方法加入

C# 我应该加入当前的方法还是让后面的方法加入,c#,exception,throw,C#,Exception,Throw,当谈到好的设计时,我遇到了困难。 我不确定是应该让后面的方法抛出异常,还是应该自己抛出异常 事情是: 异常的类型根据所调用的方法而改变。在后面的方法中,它可能是无效操作,但在当前方法中,ArgumentException可能更适合。 现在,我真的应该执行所有检查以抛出正确类型的异常,还是应该让更深层次的方法抛出错误类型的异常 考虑这一点: private bool _canWaste = false; /// <summary> /// Runs around and w

当谈到好的设计时,我遇到了困难。
我不确定是应该让后面的方法抛出异常,还是应该自己抛出异常
事情是:

异常的类型根据所调用的方法而改变。在后面的方法中,它可能是无效操作,但在当前方法中,ArgumentException可能更适合。

现在,我真的应该执行所有检查以抛出正确类型的异常,还是应该让更深层次的方法抛出错误类型的异常

考虑这一点:

private bool _canWaste = false;



/// <summary>
///    Runs around and wastes something.
/// </summary>
/// <exception cref="InvalidOperationException">
///     Thrown when <paramref name="CanPower"/> is false.
/// </exception>
public void Run(bool CanWaste) {
   _canWaste = CanWaste;
   // <- Should I check if we can waste and throw an ArgumentException here or 
   //    throw the 'wrong' type later in Waste?
   Waste();
}



/// <summary>
///    Wastes something.
/// </summary>
/// <exception cref="InvalidOperationException">
///     Thrown when we cannot waste.
/// </exception>
private void Waste() {
   if(!_canWaste) throw new InvalidOperationException("We cannot waste.");
   /* ... */
}
private bool\u canWaste=false;
/// 
///到处跑,浪费一些东西。
/// 
/// 
///错误时抛出。
/// 
公共无效运行(bool CanWaste){
_canWaste=canWaste;

//一般来说,您应该总是尽可能快地抛出。这样可以防止代码在无效状态下执行,这可能会导致重大问题(例如,您删除了所有记录,而不是一条记录,因为筛选器不正确)

此外,如果您快速抛出,您可以确保调用者获得最有意义的消息

public void Run(bool CanWaste)
{
    if(!CanWaste)
        throw new ArgumentException("CanWaste must be true", "CanWaste");
    Waste();
    // ...
}
但是,如果您不知道参数是否无效,并且确定是否昂贵(例如,您需要执行它),那么让更深入的方法抛出。 您可以在调用方法中处理
InvalidOperationException

public void Run(bool CanWaste)
{
    _canWaste = CanWaste;

    try
    {
        Waste();
    }catch(InvalidOperationException ioe)
    {
        throw new ArgumentException("CanWaste must be true", "CanWaste", ioe);
    }
}

当然,在这种情况下,很容易确定参数是否有效。这也不是最好的例子,因为只能为
true
paramater没有多大意义。

一般来说,您应该总是尽可能快地抛出。这样可以防止代码在无效状态下执行,从而导致错误ajor问题(例如,由于筛选器不正确,您删除了所有记录,而不是一条记录)

此外,如果您快速抛出,您可以确保调用者获得最有意义的消息

public void Run(bool CanWaste)
{
    if(!CanWaste)
        throw new ArgumentException("CanWaste must be true", "CanWaste");
    Waste();
    // ...
}
但是,如果您不知道参数是否无效,并且确定是否昂贵(例如,您需要执行它),那么让更深入的方法抛出。 您可以在调用方法中处理
InvalidOperationException

public void Run(bool CanWaste)
{
    _canWaste = CanWaste;

    try
    {
        Waste();
    }catch(InvalidOperationException ioe)
    {
        throw new ArgumentException("CanWaste must be true", "CanWaste", ioe);
    }
}
当然,在这种情况下,很容易确定参数是否有效。这也不是最好的例子,因为只能为
true
paramater没有多大意义。

不要抛出或让代码抛出不正确的类型异常,这对任何人都没有帮助。如果得到无效参数,则抛出
InvalidArgumentException
,否则让异常冒泡到库中的调用方

从描述中可以看出,您似乎试图通过异常控制执行流。不要这样做。异常是“异常”,当存在无法避免的异常情况时,使用它们

捕获并重新抛出该异常没有意义,除非您想自己重置堆栈跟踪。

不要抛出或让代码抛出不正确的类型异常,这对任何人都没有帮助。如果获得无效参数,请抛出InvalidArgumentException
,否则让异常从l向调用方冒出图书馆

从描述中可以看出,您似乎试图通过异常控制执行流。不要这样做。异常是“异常”,当存在无法避免的异常情况时,使用它们


捕获和重新抛出异常是没有意义的,除非您想自己重新设置堆栈跟踪。< /P>但是,如果一个参数的正确性只能通过调用一个抛出异常的方法来验证,如果该参数是无效的,那么我应该抓住它并抛出一个无效的AgjMutExtExpRebug吗?@ NoelWidmer,考虑一个简单的例子。le,假设您在尝试使用

DateTime.ParseExact
将字符串DateTime解析为
DateTime
对象时,为
DateTime
获取一个字符串参数,该参数必须采用特定的格式,并最终导致无效的字符串格式异常,在这种情况下,您可以捕获PAR期间发生的异常ing并向客户端返回一个
InvalidArgumentException
。如果您的场景与此类似,那么请确定,捕获
InvalidOperationException
,然后抛出
InvalidArgumentException
,除此之外,如果您的方法的唯一目的是验证参数,则应将其命名为可能,并可能返回布尔值指示参数是否有效,而不是抛出异常,只是让意图更明确,代码更可读,依我看。这很有用,谢谢:)另外,exec流是一个很好的提醒。请记住,这是一个“愚蠢”的例子,我并不是真的尝试这样做。但是如果参数的正确性可以只有当参数无效时调用一个抛出异常的方法才能验证。如果我捕获并抛出一个ValueAdjMutExtExpRebug?@ NoelWidmer,考虑一个简单的例子,假设您正在获得一个字符串参数,用于<代码> DATECTIME//COD>,当您尝试将字符串日期时间解析为<代码时,必须是特定格式的字符串参数。>DateTime
对象使用
DateTime.ParseExact
时,您会得到一个无效的字符串格式异常,在这种情况下,您可以捕获解析过程中发生的异常,并将
InvalidRugmentException
返回给客户端。如果您的场景与此类似,请确保捕获
InvalidOperationException
然后抛出
InvalidArgumentException
除了上述^^^^之外,如果方法的唯一目的是验证参数,那么应该将其命名为“可能”,并可能返回一个bool,指示参数是否有效,而不是抛出异常,只是让意图更明确,代码更可读,依我看。这很有用,谢谢还有,exec流是一个很好的提醒。记住,这是一个“愚蠢”的例子,我