c# - 如何在库实现中冒泡/处理 C# 异常

标签 c# .net exception

从库中提取异常的最佳方法是什么?当我实现一个接口(interface)时,用关于我的实现细节的异常来干扰调用方是好还是坏的做法?我有以下实现,其中每个实现错误都隐藏在调用方之外。在我看来,它是实现关注点分离的最干净的方式。但我到处都读到你需要冒出未触及的异常。

public class OneException : Exception
{
    public OneException()
    {
    }

    public OneException(string message): base(message)
    {
    }

    public OneException(string message, Exception innerException)
      : base(message, innerException)
    {
    }
}

还有我的库实现:

public class MyLib : IMyLib
{
    public int Divide(int a, int b)
    {
        try
        {
            if (b == 1) throw new OneException();
            return a / b;
        }
        catch (OneException e)
        {
            throw new ApplicationException("Please do not divide by 1", e);
        }
        catch (Exception e) // divide by zero and others
        {
            throw new ApplicationException("Oops", e);
        }
    }
}

最佳答案

符合Single Responsibility Principle ,您应该处理您的图书馆应该做的事情(如果可能)。否则,你应该让调用者来处理它。

在您的示例中,您正确地抛出了被零除异常。处理这不是您的图书馆的责任(除非您将其宣传为“安全”的划分方法)。该错误是由不正确的客户端输入引起的,因此应该由客户端来处理。

然而,您的 OneException 将是一个不寻常的抛出异常。为什么客户端不能除以一个?它当然不会造成伤害。这大概是一个人为的例子,但你不应该抛出异常,除非确实存在内部无法解决的问题。如果有人想除以一,为什么不允许他们这样做?

良好的异常处理会通知客户他们的输入问题和/或系统故障,而不是您的逻辑中的错误。

关于c# - 如何在库实现中冒泡/处理 C# 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11010036/

相关文章:

C# - 整数的正确验证

Java 文件 channel 异常

c# - 如何将多个列表项合并为一个项目?

javascript - 如何在 asp.net c# 中显示进度条直到整个 aspx 加载完毕

c# - 通过 SOCKS5 代理连接到 .NET 网络服务

c# - 在 StringTemplate 中分组

java - 如何在 Eclipse 中为可选 Java 异常生成代码

c# - 列表与字典(哈希表)

c# - 具有通用对象的 WebAPI CreateResponse

.net - 模拟 WCF 客户端代理的最佳方法