C# MVC中OracleException的处理
会计控制员C# MVC中OracleException的处理,c#,.net,asp.net-mvc,exception,C#,.net,Asp.net Mvc,Exception,会计控制员 namespace IndividueleOpdracht.Controllers { public class AccountController : Controller { [HttpPost] public ActionResult Signup(SignupViewModel model) { if (ModelState.IsValid) {
namespace IndividueleOpdracht.Controllers
{
public class AccountController : Controller
{
[HttpPost]
public ActionResult Signup(SignupViewModel model)
{
if (ModelState.IsValid)
{
var accountModel = new AccountModel();
try
{
accountModel.Signup(model);
return RedirectToAction("Login", "Account");
}
catch (SignupException e)
{
ModelState.AddModelError("SignupError", e.Message);
}
}
return View(model);
}
}
}
用于注册的Viewmodel
namespace IndividueleOpdracht.ViewModels
{
public class SignupViewModel
{
[Required(ErrorMessage = "Vul een naam in")]
public string Name { get; set; }
[StringLength(16)]
[Required(ErrorMessage = "Vul een gebruikersnaam in")]
public string Username { get; set; }
[Required(ErrorMessage = "Vul een email adres in")]
public string Email { get; set; }
[Required(ErrorMessage = "Vul een wachtwoord in")]
public string Password { get; set; }
}
}
注册(模型)调用存储库
using Oracle.ManagedDataAccess.Client;
namespace IndividueleOpdracht.DAL
{
public class AccountContext : OracleContext
{
public void Insert(SignupViewModel account)
{
using (var conn = new OracleConnection(connectionString))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO Account " +
"(Id, Name, Username, Email, Password) " +
"VALUES " +
"(account_seq.NEXTVAL, :name, :username, :email, :password)";
cmd.Parameters.Add(new OracleParameter("name", account.Name));
cmd.Parameters.Add(new OracleParameter("username", account.Username));
cmd.Parameters.Add(new OracleParameter("email", account.Email));
cmd.Parameters.Add(new OracleParameter("password", account.Password));
if (cmd.ExecuteNonQuery() == 0) // Will throw a OracleException
{
throw new LoginException("Een of meer velden zijn niet correct ingevuld.");
}
}
}
}
}
}
此上下文方法由存储库调用
using Oracle.ManagedDataAccess.Client;
namespace IndividueleOpdracht.DAL
{
public class AccountContext : OracleContext
{
public void Insert(SignupViewModel account)
{
using (var conn = new OracleConnection(connectionString))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO Account " +
"(Id, Name, Username, Email, Password) " +
"VALUES " +
"(account_seq.NEXTVAL, :name, :username, :email, :password)";
cmd.Parameters.Add(new OracleParameter("name", account.Name));
cmd.Parameters.Add(new OracleParameter("username", account.Username));
cmd.Parameters.Add(new OracleParameter("email", account.Email));
cmd.Parameters.Add(new OracleParameter("password", account.Password));
if (cmd.ExecuteNonQuery() == 0) // Will throw a OracleException
{
throw new LoginException("Een of meer velden zijn niet correct ingevuld.");
}
}
}
}
}
}
处理Oracle异常的最佳方法是什么?只需在try/catch中添加另一个catch,然后您就可以在控制器中使用数据…处理发生的异常。
我认为最好的位置是在
AccountContext.Insert
方法中。在那里,而且只有在那里,您处于异常的上下文中,并且处于与数据库的关系中(为什么您的帐户控制器毕竟需要知道有一个Oracle数据库?)。在那里处理。我建议在那里捕获异常,将其包装在您可以在外部处理的东西中,然后重新抛出它。我不同意前面的海报,而是建议您根本不处理它(直接在控制器/DAL中)
我建议您使用ASP.net中的功能,在发生未经处理的异常时显示适当的错误屏幕,并在后台日志中显示意外错误,以便您可以随后检查它。(出于这些目的,我是Elmah的粉丝:)
除非您有特定的要求(例如,在数据库出现故障时重试),否则我建议不要将代码与异常处理混为一谈,而是在公共位置处理任何意外的异常。Soo,最好的方法是什么?如果我在catch中抛出一个新的LoginException,它将不会在LoginException中捕获..然后在控制器中捕获您需要的任何内容,只要它不是
OracleException
。愚蠢的我,我试图抛出一个LoginException并在SignupException捕获块中处理它。感谢您的解释您从未在UI中处理Oracle异常。相反,您会抛出一个应用程序能够理解的异常。你将另一个异常包装在内部异常中。我认为never有点强,这取决于你的应用程序。就我个人而言,我只是一个不捕捉异常的粉丝,除非我能在捕捉到的地方处理它们。我同意你的最后一句话。如果有道理,你就抓住它。在异常处理中抽象出实际的数据访问层是有意义的。您不想告诉用户ORA-0XXXX
。您想告诉我,由于权限问题,无法访问表X。显然,必须捕获原始异常以进行日志记录。