c# - 异常处理时捕获块中的 System.Web.Http.HttpResponseException
问题描述
我故意违反数据库中的唯一约束,并尝试处理异常。
这其中包括我的形式:
HttpResponseMessage response = KorisniciService.PostResponse(k);
if (response.IsSuccessStatusCode)
{
MessageBox.Show(Messages.add_usr_succ);
DialogResult = DialogResult.OK;
Close();
}
else
{
string message = response.ReasonPhrase;
if (string.IsNullOrEmpty(Messages.ResourceManager.GetString(response.ReasonPhrase)))
message = Messages.ResourceManager.GetString(response.ReasonPhrase);
MessageBox.Show("Error code: " + response.StatusCode + " Message: " + message);
}
我的控制器:
public IHttpActionResult PostKorisnici(Korisnici obj)
{
if (!ModelState.IsValid)
return BadRequest();
try
{
obj.KorisnikId = Convert.ToInt32(dm.esp_Korisnici_Insert(obj.Ime, obj.Prezime, obj.Email, obj.Telefon, obj.KorisnickoIme, obj.LozinkaSalt, obj.LozinkaHash, obj.Status, obj.Adresa, obj.GradId).FirstOrDefault());
}
catch (EntityException ex)
{
throw CreateHttpResponseException(Util.ExceptionHandler.HandleException(ex), HttpStatusCode.Conflict);
}
foreach (var item in obj.Uloge)
{
dm.esp_KorisniciUloge_Insert(obj.KorisnikId, item.UlogaId);
}
return CreatedAtRoute("DefaultApi", new { id = obj.KorisnikId }, obj);
}
HttpResponseException 制作函数:
private HttpResponseException CreateHttpResponseException(string reason, HttpStatusCode code)
{
HttpResponseMessage msg = new HttpResponseMessage()
{
StatusCode = code,
ReasonPhrase = reason,
Content = new StringContent(reason)
};
return new HttpResponseException(Request.CreateResponse(msg));
}
异常处理类:
public class ExceptionHandler
{
public static string HandleException(EntityException error)
{
SqlException ex = error.InnerException as SqlException;
switch (ex.Number)
{
case 2627:
{
return GetConstraintExceptionMessage(ex);
}
default:
return error.Message + "(" + error +")";
}
}
/*Message "Violation of UNIQUE KEY constraint 'CS_KorisnickoIme'. Cannot insert duplicate key in object 'dbo.Korisnici'. The duplicate key value is (farish).\r\nThe statement has been terminated." string*/
private static string GetConstraintExceptionMessage(SqlException error)
{
string newMessage = error.Message;
int startIndex = newMessage.IndexOf("'");
int endIndex = newMessage.IndexOf("'", startIndex + 1);
if (startIndex>0 && endIndex>0)
{
string constraintName = newMessage.Substring(startIndex + 1, endIndex - startIndex - 1);
if (constraintName == "CS_KorisnickoIme")
newMessage = "username_con";
else if (constraintName == "CS_Email")
newMessage = "email_con";
}
return newMessage;
}
因此,当我产生错误时,我在 post 方法的第一个 catch 块中得到了 System.Web.Http.HttpResponseException而不是弹出窗口(在教程视频中显示良好),并且没有任何内容传回我的表单。
解决方案
我认为是因为异常被抛出而不是在 try/catch 块内,或者接收 CreateHttpResponseException 的 catch 块正在吸收它而不是提供响应对象。
编辑 您可以发布 KorisniciService.PostResponse 的代码吗?
没有任何东西传回我的表格
最终的结果是什么?从您发布的表单代码中,它应该弹出带有成功消息的消息框,或者弹出带有失败消息的消息框。实际发生了什么?
第二次编辑
根据更多信息,在您的表单代码中使用它...
try
{
HttpResponseMessage response = KorisniciService.PostResponse(k);
if (response.IsSuccessStatusCode)
{
MessageBox.Show(Messages.add_usr_succ);
DialogResult = DialogResult.OK;
Close();
}
}
catch(HttpResponseException ex)
{
string message = ex.ReasonPhrase;
if (string.IsNullOrEmpty(Messages.ResourceManager.GetString(ex.ReasonPhrase)))
message = Messages.ResourceManager.GetString(ex.ReasonPhrase);
MessageBox.Show("Error code: " + ex.StatusCode + " Message: " + message);
}
推荐阅读
- maven - 从给定的 pom.xml 文件中提取类路径的简单 java 代码?
- c++ - 在 Mac OS 中移动第三方窗口
- reactjs - 如何在 Reactjs 的同一页面中显示提交的表单数据?
- angular - 基于行跨度对数据进行分组后行的角度primeng p表选择
- php - 我不知道这段代码有什么错误
- python - 包中的覆盖函数
- c++ - 如何从长指针中提取 little-endian unsigned short?
- objective-c - 如何获取当前激活的视图?
- php - 无法更新数据并存储在数据库中
- java - 在 jmeter beanshell 代码中使用 List 时在 Jmeter 中遇到“=”错误