Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# DAL中的异常处理_C#_.net_Exception Handling_Mvp - Fatal编程技术网

C# DAL中的异常处理

C# DAL中的异常处理,c#,.net,exception-handling,mvp,C#,.net,Exception Handling,Mvp,在MVP winforms应用程序中,我在DAL中处理异常,如下所示 因为用户消息传递不是DAL的责任,所以我想把它转移到我的演示类中 你能告诉我一个标准的方法吗 public bool InsertAccount(IBankAccount ba) { string selectStatement = @"IF NOT EXISTS (SELECT ac_no FROM BankAccount WHERE ac_no=@ac_no) BEGIN INSERT IN

在MVP winforms应用程序中,我在DAL中处理异常,如下所示

因为用户消息传递不是DAL的责任,所以我想把它转移到我的演示类中

你能告诉我一个标准的方法吗

    public bool InsertAccount(IBankAccount ba)
    {
        string selectStatement = @"IF NOT EXISTS (SELECT ac_no FROM BankAccount WHERE ac_no=@ac_no) BEGIN INSERT INTO BankAccount ...";

        using (SqlConnection sqlConnection = new SqlConnection(db.ConnectionString))
        {
            using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection))
            {
                try
                {
                    sqlConnection.Open();
                    sqlCommand.Parameters.Add("@ac_no", SqlDbType.Char).Value = ba.AccountNumber;
                    //
                    //

                    sqlCommand.ExecuteNonQuery();
                    return true;
                }
                catch (Exception e) { MessageBox.Show(("Error: " + e.Message)); }
                if (sqlConnection.State == System.Data.ConnectionState.Open) sqlConnection.Close();
                return false;
            }

        }
    }
EDIT2:

根据答案,我重新编辑了这篇文章,现在我的异常处理代码如下所示

DAL

public bool InsertAccount(IBankAccount ba)
{
    try
    {
        sqlConnection.Open();
        //   
    }
    catch (SqlException)
    {
        throw new Exception("DataBase related Exception occurred");
    }
    catch (Exception)
    {
        throw new Exception("Exception occurred");
    }
}
BankAccountPresenter

    private void SaveBankAccount()
    {
        try
        {
           _DataService.InsertAccount(_model);
        }
        catch (Exception e) { MessagingService.ShowErrorMessage(e.Message); }
    }
我在DAL中捕获异常的原因是,即使目前我没有记录错误,将来也可能不得不这样做

通过这种方式,我可以区分DAL中的错误消息,无论是sql相关的还是通用的

我在演示者中显示错误消息时使用了消息服务


这意味着完整吗?这可以简化吗?

返回false表示出现异常。不建议这样做

重播

catch(Exception e) {
  //blah, maybe add some useful text to e
   throw;
}
finally { //close up shop Although, look up what using does first incidentally }
然后在更高的级别上处理它(
catch(Exception e){MessageBox.Show((([Error:+e.Message));}

回复EDIT2:

那很好。但是,您当前的实现会在bin中抛出“实际”异常及其堆栈跟踪,以支持您的有用消息。您需要将其作为内部异常添加,如下所示:

catch(Exception e){    
     throw new Exception("some helpful message", e);
}

返回false表示出现异常。不建议这样做

重播

catch(Exception e) {
  //blah, maybe add some useful text to e
   throw;
}
finally { //close up shop Although, look up what using does first incidentally }
然后在更高的级别上处理它(
catch(Exception e){MessageBox.Show((([Error:+e.Message));}

回复EDIT2:

那很好。但是,您当前的实现会在bin中抛出“实际”异常及其堆栈跟踪,以支持您的有用消息。您需要将其作为内部异常添加,如下所示:

catch(Exception e){    
     throw new Exception("some helpful message", e);
}


事实上,使用“throw;”的特殊注释而不是“扔ex;”保持堆栈跟踪。@L-3这就是我发布代码的原因。也许它应该是明确的。这肯定是个陷阱。throw e将在演示者或同一DAL?@Chaturanga演示层的同一侧重置参数,例如更高级别的Exception.stackwalk。在你的情况下,只有当你准备好处理它时,你才能永远抓住它,通过提醒用户。查图兰加回答说:“如果你可以在DAL中处理一些事情,比如再试一次,显然情况并非如此。”。我认为你的实施很好。我不知道为什么
sqlConnection.Open()在那里。我想你还是需要抬头看看。它写起来很短,澄清了您的意图(在使用连接时和范围内都非常清楚),并避免了错误(我注意到您的配置是在
try
中,而不是在
finally
中。这将是一个错误,但您不必在意是否正在使用
实际上,使用“throw;”的特别备注而不是“扔ex;”保持堆栈跟踪。@L-3这就是我发布代码的原因。也许它应该是明确的。这肯定是个陷阱。throw e将在演示者或同一DAL?@Chaturanga演示层的同一侧重置参数,例如更高级别的Exception.stackwalk。在你的情况下,只有当你准备好处理它时,你才能永远抓住它,通过提醒用户。查图兰加回答说:“如果你可以在DAL中处理一些事情,比如再试一次,显然情况并非如此。”。我认为你的实施很好。我不知道为什么
sqlConnection.Open()在那里。我想你还是需要抬头看看。它写起来很短,澄清了您的意图(在使用连接时和范围内都非常清楚),并避免了您的错误(我注意到您的配置是在
try
中,而不是在
finally
中。这将是一个错误,但您不必在意是否正在使用
仅供参考,在使用中包装连接时,无需关闭连接。即使出现异常,用户也会自动关闭连接。“看问题!”亚伦·卡尔森,看着你的编辑。捕获
异常
并不是为了抛出一个带有“无效银行帐户”消息的新
异常
。你应该只抓住你能处理的。类似于
OutOfMemoryException
之类的东西不是无效的银行帐户。@Smith.h.Neil,好吧,如果我的目标是,当出现问题时,提醒用户并保持系统正常运行(而不会崩溃),那么我的处理方式还不够吗?如果是这样的话,我应该重新抛出异常吗?好吧,有时候应用程序会崩溃,这就是要做的。如果内存不足,则表示内存不足。事实上,我不会抓住你的DAL(至少从我所看到的来看不是这样)。你在那里什么都不干,所以没有理由在那里抓。在演示者中,我将捕获
SqlException
并正确地处理(显示错误消息)给用户,并且我将让clr.FYI处理关键异常,在使用中包装连接时,无需关闭连接。即使出现异常,用户也会自动关闭连接。“看问题!”亚伦·卡尔森,看着你的编辑。捕获
异常
并不是为了抛出一个带有“无效银行帐户”消息的新
异常
。你应该只抓住你能处理的。类似于
OutOfMemoryException
之类的东西不是无效的银行帐户。@Smith.h.Neil,好吧,如果我的目标是,当出现问题时,提醒用户并保持系统正常运行(而不会崩溃),那么我的处理方式还不够吗?如果是这样的话,我应该重新抛出异常吗?好吧,有时候应用程序会崩溃,这就是要做的。如果内存不足,则表示内存不足。事实上,我不会抓住你的DAL(至少从我所看到的来看不是这样)。你在那里什么都不干,所以没有理由在那里抓。在您的演示者中,我将捕获
SqlE