【发布时间】:2015-08-11 13:03:00
【问题描述】:
我在我的应用程序服务器中遵循 MVC 模式。我试图抛出一个异常,但它没有被正确抛出。
这是控制器的代码:
[HttpPost]
public IHttpActionResult PostAddSuperUser(SuperUserViewModel SU)
{
try
{
//more code
blHandler.addSuperUser((SuperUser)SU.user, SU.Password);
return Ok();
}
catch (EUserAlreadyExist ex)
{
var resp = new HttpResponseMessage(HttpStatusCode.NotAcceptable);
resp.Content = new StringContent(string.Format("Already exist ", SU.user.Mail));
resp.ReasonPhrase = "Already exist";
throw new HttpResponseException(resp);
}
然后客户端调用如下:
try{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:50687/");
HttpResponseMessage response = await client.PostAsJsonAsync<SuperUserViewModel>("/api/SuperUser/PostAddSuperUser", SUVM);
if (response.IsSuccessStatusCode)
{
new SuccesPupUp("", "SuperUser " + SupUserName + " was added");
}
this.Close();
}
}
catch (HttpResponseException Exc)
{
new ErrorPopUp("", Exc.Message);
}
根据这个this,我正确地抛出了它,但是当我运行它时,我得到了这个错误
我该如何解决?
编辑:我想向客户端抛出异常,以便它可以要求用户提供新的电子邮件地址
【问题讨论】:
-
如您所见,它会抛出您没有捕获的
HttpResponseException,只需添加第一个捕获 -catch(HttpResponseException ex) -
由于您询问的是“正确处理异常”,请注意使用 Exception 后缀而不是前缀“E”来命名异常是“最佳实践”。例如,
EInvalidPassword应该命名为InvalidPasswordException,是的,它更长,但更明显的是它是什么。 -
在
catch()中你必须处理HttpResponseException,而不是EUserAlredyExist,因为你不会抛出EUserAlredyExist异常。 -
这个问题与stackoverflow.com/questions/19287426/…有关。如果您从一个 catch 块中抛出一个异常,并且在该块之外没有 catch 块,则该异常是未处理的。
-
@DanielPetrovaliev,他的 blHandler.addSuperUser() 方法可能会抛出
EUserAlreadyExist异常,这就是他捕捉它的原因。
标签: c# .net web-services web exception-handling