gpt4 book ai didi

c# - 如何在多层程序中重新抛出异常?

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:00 25 4
gpt4 key购买 nike

我有一个 MVC EF5 设置,其中包含类:

  • 程序 - 这是 Controller
  • UserInterface - 这是 View ,负责显示和提示数据。
  • DataAccess - 模型,它在我的 EF 模型类中创建、读取、更新和删除数据

当 DataAccess 类尝试对我的数据库执行 CRUD 操作时,如果发现错误,则需要进行处理,我的 UserInterface 类需要向用户打印消息,并在必要时报告任何错误。因此,当发生错误时,需要先通过程序类,然后到 UserInterface 类,因为数据层不应该直接与表示层通信。

有人向我建议我不要将异常传递或返回给调用函数,而是我应该“向上面的层抛出一个新的更简单的异常”。所有这些关于异常的讨论都让我感到困惑,因为我对异常的经验仅限于这种格式:

try
{
// stuff
}
catch (exception ex)
{
console.writeline(ex.ToString());
}

我自己做了一些研究,试图找到这个问题的答案,我学到了一些东西,但不知道如何把它们放在一起:

我了解到:

  • throw; 重新抛出异常并保留堆栈跟踪
  • throw ex 抛出现有的异常,例如在 catch block 中捕获的异常。并重置堆栈跟踪。
  • 有一个名为 Exception.StackTrace 的属性。我了解每次抛出异常时,调用堆栈中的帧都会记录到 Exception.StackTrace 属性中。

但是,我不知道在哪里放置我的 try/catch block 以利用重新抛出

是不是像下面的代码?还是我忽略了它是如何工作的?

已编辑:(添加了更多内容以使其他人理解这种猜测)

        void MethodA()  
{
try
{
MethodB();
}
catch (MyExceptionType ex)
{
// Do stuff appropriate for MyExceptionType
throw;
}
}
void MethodB()
{
try
{
MethodC();
}
catch (AnotherExceptionType ex)
{
// Do stuff appropriate for AnotherExceptionType
throw;
}
}
void MethodC()
{
try
{
// Do Stuff
}
catch (YetAnotherExceptionType ex)
{
// Do stuff appropriate for YetAnotherExceptionType
throw;
}
}

最佳答案

不仅仅是如何使用不同类型的异常处理。从功能上讲,您应该定义哪些层必须在异常情况下执行哪些操作。

像数据层一样 => 除了 DataException 或 SQLException 之外不要抛出任何东西。记录它们并将通用数据库异常返回给 UI。

业务层 => 记录并重新抛出简单的业务异常UI 层 => 仅捕获业务异常并在业务异常内的消息中提醒它

一旦定义了所有这些,您就可以使用您所学和总结的问题来构建它。

关于c# - 如何在多层程序中重新抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14060042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com