Как исправить исключение DivideByZeroException

Я использую DevExpress XAF Framework.

У меня есть класс с множеством Persistent Alias атрибутов, который выполняет некоторые математические операции со свойствами. Вот пример моего кода:

[PersistentAlias("ShortTermDebt + LongTermDebt / EquityTotal")]
public decimal DebtEquity
{
    get
    {
        return decimal.Parse(EvaluateAlias("DebtEquity").ToString());
    }
}

Я попытался установить свойство = 1

return DebtEquity = 1;

Но все это сбрасывает свойство на 1 при сохранении.

Я попытался установить значение по умолчанию в SQL Server для каждого свойства на 1. Но это тоже не работает.

По сути, у меня есть Detailview, в котором есть куча вычислений. И когда я хочу создать НОВОЕ подробное представление, я получаю DivideByZeroException, потому что, конечно же, НОВОЕ подробное представление/объект не будет иметь никаких значений. Любые идеи, как я могу обойти это?


person EB.    schedule 03.02.2015    source источник
comment
Я думаю, вам понадобятся круглые скобки вокруг добавления краткосрочного и долгосрочного долга, иначе он сначала оценит LongTermDebt / EquityTotal, а затем добавит ShortTermDebt.   -  person Rufus L    schedule 04.02.2015


Ответы (2)


Если вы можете получить значение EquityTotal, вы можете сначала проверить его на ноль, иначе вы можете поймать исключение.

Пример с первым значением проверки:

[PersistentAlias("ShortTermDebt + LongTermDebt / EquityTotal")]
public decimal DebtEquity
{
    get
    {
        if (EquityTotal == 0) return 0;  // return 0 or whatever number you want when EquityTotal is equal to zero
        return decimal.Parse(EvaluateAlias("DebtEquity").ToString());
    }
}

Пример с пойманным исключением:

[PersistentAlias("ShortTermDebt + LongTermDebt / EquityTotal")]
public decimal DebtEquity
{
    get
    {
        try
        {
            return decimal.Parse(EvaluateAlias("DebtEquity").ToString());
        }
        catch (DivideByZeroException)
        {
            return 0;  // return 0 or whatever number you want when EquityTotal is equal to zero
        }
    }
}
person Aalawlx    schedule 03.02.2015
comment
Я бы рекомендовал не ловить исключение. Гораздо лучше избежать предотвратимого исключения, чем обрабатывать его. - person Eric Lippert; 04.02.2015

В качестве альтернативы использованию чистого синтаксиса языка критериев вы можете использовать:

[PersistentAlias("Iif(EquityTotal > 0,ShortTermDebt+LongTermDebt/EquityTotal, 0)")]
public decimal DebtEquity
{
    get => Convert.ToDecimal(EvaluateAlias(nameof(DebtEquity)))
}
person Oliver    schedule 23.01.2021