如何根据ArgumentException中的条件添加更多变量

时间:2019-02-12 15:40:59

标签: c#

我手里有一个运输ID,我的目的是检查数据库此运输ID是否已分配给计划ID。如果已经分配了运输编号,则抛出参数异常{Shipping Id} has already assigned to Existing {Plan Id}

我可以为一个计划ID执行此操作。但是,如果该运输ID已经分配了多个计划ID,那么我应该扔掉所有这个计划ID。但是我不能使用Argument Exception。

我的代码:

foreach (var existingPlanId in checkExistingDateWithOtherPlanIds){
    var checkPlanId = existingPlanId.ShippingSerieses.Contains(existingShippingId);
    if (checkPlanId)
    {
      throw new ArgumentException($"ERROR#3% Shipping Id has already assigned to Plan Id: {Environment.NewLine}" +
                                  $"ShippingID -> Plan ID {Environment.NewLine}" +
                                  $"{existingShippingId.ShippingId} -> {existingPlanId.PlanId}, {positioningPlanToChange.PlanId}");                      
    }

}

预期结果:

Shipping Id has already assigned to Plan Id:

ShippingID -> Plan ID

423 -> 601, 263, 321 341 , 543

2 个答案:

答案 0 :(得分:0)

我不确定是否要在引发异常后停止程序,还是要继续执行。 从您的代码段中,您的程序将在第一次抛出后停止。

如果您希望它继续执行,请添加一个try catch块作为波纹管

foreach (var existingPlanId in checkExistingDateWithOtherPlanIds){
    var checkPlanId = existingPlanId.ShippingSerieses.Contains(existingShippingId);
    if (checkPlanId)
    {
        try {
            throw new ArgumentException($"ERROR#3% Shipping Id has already assigned to Plan Id: {Environment.NewLine}" +
                                      $"ShippingID -> Plan ID {Environment.NewLine}" +
                                      $"{existingShippingId.ShippingId} -> {existingPlanId.PlanId}, {positioningPlanToChange.PlanId}");  
        }   
        catch {}
    }
}

如果您打算在引发异常后停止程序执行,但仍显示所有相关产品。您必须在循环结束时抛出异常。

答案 1 :(得分:0)

您的案例看起来您需要自己的Exception继任者:

public class PlanException : Exception
{
    public int PlanId { get; }

    public int ShippingId { get; }

    public PlanException(string message, int planId, int shippingId)
      : base(message)
    {
        PlanId = planId;
        ShippingId = shippingId;
    }
}

或者,您可以使用Exception类的Data属性。

public static class ExceptionExtensions
{
    public static Exception AddData(this Exception exception, object key, object value)
    {
        exception.Add(key, value);

        return exception;
    }
}

. . .

throw new ArgumentException("Shipping id is already assigned.").AddData("planId", planId)
                                                               .AddData("shippingId", shippingId); 

ArgumentException并非适合您的情况的例外。通常,当参数具有意外值而无需复杂代码即可检查时,您可以抛出ArgumentException

例如:“一个参数应为正”,“一个参数应在2到10之间”,等等。

如您所见,您的情况更为复杂,所以也许InvalidOperationException是更适合您的例外情况。