首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示异常

显示异常
EN

Software Engineering用户
提问于 2021-02-01 15:30:00
回答 3查看 208关注 0票数 1

我阅读/观察了Bob叔叔干净的代码,当他谈到异常时,他建议有一个名很好的异常,而不是一个对程序员来说非常有意义的描述,用于将主要应用程序与业务逻辑和测试分离开来。

但是用户呢?我有一个应用程序需要几个参数,每个参数都可能是错误的。我对这些解决方案很难接受,但它们各有优缺点:

  1. 显式消息优点:消息是例外的,因此它应该是准确的。缺点:它将业务逻辑与UI结合起来。
  2. catch的优点:消息与业务逻辑分离,因此消息可以具有自定义格式,可以在不触及业务规则的情况下进行更新等缺点:添加一个新的异常将需要修改该开关,因此我可能会错过一个异常。
  3. 结合1和2的优点和缺点:它将有最好的和最坏的以前的解决方案。

我错过了好的第四个选择吗?

EN

回答 3

Software Engineering用户

发布于 2021-02-02 10:54:26

为什么异常有名称/类型?

因为我们有代码构造来根据异常类型捕获异常。

为什么异常具有自定义属性?

这样,捕获异常的代码就有了处理以一致格式传递给它的异常所需的所有信息。

为什么异常有消息?

可能是因为异常“从错误中”“增长”出来,并且它们曾经有代码和消息。

用户是否应该看到异常?

不是整件事,不是。

它们是一个巨大的、可怕的屏幕,充斥着用户根本不感兴趣的技术“胡言乱语”。

用户是否应该看到异常消息?

也许,但是,正如你非常正确地说的那样,你在翻译和信息需要生成的地方遇到了各种各样的麻烦。

捕捉并即时翻译消息(您的“案例”语句)是另一种选择,但请记住,您不能仅仅在消息中寻找确切的单词,因为,错误地引用了伦纳德McCoy的话:

我了解开发人员,他们喜欢改变事物。

当然,如果没有合适的翻译/映射,您的"case“语句应该始终具有逐字传递给定消息的次要位置,或者附加一个”我不认得这个消息!“绰号。这样你就不会“错过”任何东西。

票数 0
EN

Software Engineering用户

发布于 2021-02-02 12:06:01

选项1混淆了应用程序逻辑和UI,正如您已经注意到的。它还会破坏应用程序的国际化,因为消息是硬编码到应用程序代码中的。

选项2只是将问题转移到应用程序逻辑的另一个部分。

如果需要向用户显示异常,而不是所有异常都显示出来,那么将异常传递到UI层。然后,它可以查看异常类型,以及在异常中传递的任何数据,然后确定要显示给用户的消息。使用查找表(而不是开关语句)来处理所有不同的异常类型可能会更好。

票数 0
EN

Software Engineering用户

发布于 2021-08-17 06:06:35

请看维克托·伦蒂亚的以下文章:https://victorrentea.ro/blog/presenting-exceptions-to-users/

它关注于Java,但是这种方法也适用于C#。

他们的想法是:

为要以不同方式显示的每个错误条件定义一个带有值的枚举:

代码语言:javascript
运行
复制
public enum ErrorCode { General, BadConfig, ... }

当您这样做时,考虑一下用户可以对错误做些什么。如果用户不能对此做任何事情,只需使用General错误代码,这将最终显示如下:“哎呀,出了问题,对不起。请稍后再试。”

接下来,定义一个自定义应用程序异常,其中包含这样的错误代码:

代码语言:javascript
运行
复制
public class AppException : Exception
{
    public ErrorCode errorCode {get;}

    public AppException(ErrorCode errorCode)
    {
        this.errorCode = errorCode;
    }
}

然后,在主应用程序中捕获异常。如果是AppException,则提取ErrorCode并调用一些逻辑将其转换为消息。消息也可以来自属性文件。如果是其他异常,则以与带有AppException错误代码的General一样的方式显示它。

所以总的来说,这是在你的两个选择之间,有一些好处。

业务逻辑不关心错误消息,只关心错误条件。但是,对于每个错误条件,您不需要一个自定义异常类型,只需要一个枚举值。

在捕获异常时,您只关心两种情况:AppException和所有其他Exception。将错误代码转换为消息可以委托给另一个方法或另一个类。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/421720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档