【发布时间】:2019-11-28 10:36:28
【问题描述】:
我在我的 asp.net 项目中创建了一个 ApplicationException。我的想法是,我使用这个 ApplicationExcpetion 向用户抛出带有适当消息的异常,并使用 Exception 向用户发送一般消息来处理一般和意外错误。
public async Task<HttpResponseMessage> Get([FromUri]GetDto getDto)
{
try
{
var response = await _application.Get(getDto);
return Request.CreateResponse(HttpStatusCode.OK, response);
}
catch (ApplicationException ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
catch (Exception)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError,
"There was an error on the request.");
}
}
问题是我创建了一个派生自 ApplicationException 的 CustomException 类,当它被抛出时,它总是停在 Exception 捕获上,而不是我所期望的 ApplicationException 捕获。
public class ApplicationException : Exception
{
public ApplicationException(string message) : base(message)
{
}
public ApplicationException(string message, Exception innerException)
: base(message, innerException)
{
}
}
public class CustomException: ApplicationException
{
private static readonly string MESSAGE = "customMessage";
public CustomException(): base(MESSAGE) { }
}
我做错了什么吗?将海关申请例外与其他例外分开处理这样的例外的正确方法是什么?
【问题讨论】:
-
这里明显错误的一件事是您捕获了一个
Exception实例并记录了关于它的nothing。无论您返回给客户什么,您至少应该记录详细信息以供内部使用。例如,这还可以让您查看异常的实际类型,这样您就可以验证它是否真的是CustomException您正在到达这里(我怀疑它不是)。 -
是的,但是由于我是在异常捕获之前捕获ApplicationExceptions,所以错误应该属于ApplicationException捕获,对吧?
-
ApplicationException不是你自己写的,是吗?有System.ApplicationException... -
我无法重现此内容。就像你说的那样,
catch(SomeException)捕获了源自SomeException的所有异常类型。所以看起来 Fildor 是对的,你不是在抓 yourApplicationException,而是System.ApplicationException。 (或者那个错误已经发生在继承中)。 -
正确,正如我在回答中所写,问题是已经存在 System.ApplicationException。我认为的另一个解决方案是删除我的 ApplicationException 类并使 de CustomException 派生自这个已经存在的 System.ApplicationException