Как игнорировать DivideByZeroException в представлениях Razor

1

RazorEngine используется для запуска представлений С# Razor в приложении ASP.NET MVC4.

Представления содержат десятичные выражения, завернутые в пользовательский вызов функции функции Format

<div>@Format(somedecimalexpression/someotherdecimalexpression)</div>

Это вызывает исключение

Attempted to divide by zero

если значение someotherdecimalexpression равно 0

Как заставить двигатель бритвы игнорировать деление на нулевое исключение? Он может возвращать большое десятичное число или null в пустой строке, если это происходит.

Выражения создаются конечными пользователями во время выполнения. Поля базы данных имеют десятичный тип и сложно преобразовать все операнды в двойные, чтобы удалить это исключение.

Проверить, что переполнение artihmetic не проверяется в свойствах проекта, но это не помогает. Я пытался

<div>@Eval("somedecimalexpression/0")</div>

и в базовом классе шаблонов

public string Eval(string expression) {

try {

  return Format(Run(expression));
}
catch (DivideByZeroException) {
  return ""
}

}

но получил ошибку компиляции, так как не существует метода Run.

Теги:
razor
asp.net-mvc-4
razorengine
dividebyzeroexception

2 ответа

1
Лучший ответ

Если вы знаете имя someotherdecimalexpression во время выполнения, вы можете сделать следующее:

string name = "someotherdecimalexpression";
template = template.Replace(name, "(double)" + name);

Это преобразует все someotherdecimalexpression в double для вычисления, и вы получите Infinity вместо исключения.

Но имейте в виду "побочные эффекты", например, если это name которое также можно использовать, например, "в тексте"...

1

Я согласен с комментарием Уриила. Если вам все еще нужна логика в представлении, вы можете обойти ошибку, используя if

<div>
    @if(someotherdecimalexpression != 0){
        Format(somedecimalexpression/someotherdecimalexpression)
    }
</div>
  • 0
    Выражение может быть изощренным, может содержать количество делений, вызовы методов .NET и другие операции с временными параметрами. Как найти все другие выражения выражения, которые могут вызвать ошибки деления? Похоже, ваш ответ требовал синтаксического анализа выражений вручную, чтобы найти возможные деления на ноль. Как это реализовать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню