Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC中OracleException的处理_C#_.net_Asp.net Mvc_Exception - Fatal编程技术网

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。显然,必须捕获原始异常以进行日志记录。