1) Да.
2) Да, все в порядке. Вы можете создавать объекты любой структуры, а не только анонимные.
public class ErrorModel
{
public string Error { get; set; }
public int Id { get; set; }
public List<int> Values { get; set; }
}
//filter
var error = new ErrorModel
{
Error = context.Exception.Message,
Id = 1,
Values = new List<int> { 1, 2, 3 }
};
context.Result = new ObjectResult(error)
{
StatusCode = 500
};
3) Возможно, в вашем приложении имеется несколько фильтров исключений, и если вы не установите ExceptionHandled
на true
во время обработки исключения, тогда будет вызван каждый фильтр и Result
будет переопределен. Цель этого свойства - указать, что определенный фильтр был в состоянии справиться с исключением, и нет необходимости запускать другие фильтры исключений. Это полезно в сценарии, когда фильтр может обрабатывать только определенные типы исключений.
//handles only exceptions caused by dividing by zero
public class DivideByZeroExceptionFilterAttribute : Attribute, IExceptionFilter
{
public void OnException(ExceptionContext context)
{
//chech if this is divide by zero exception
if (!(context.Exception is DivideByZeroException))
return;
var myerror = new
{
result = false,
message = "Division by zero went wrong"
};
context.Result = new ObjectResult(myerror)
{
StatusCode = 500
};
//set "handled" to true since exception is already property handled
//and there is no need to run other filters
context.ExceptionHandled = true;
}
}