C# 是否应直接向用户显示Exception.Message属性?

C# 是否应直接向用户显示Exception.Message属性?,c#,java,oop,exception-handling,C#,Java,Oop,Exception Handling,这听起来可能是个愚蠢的问题,但我想收集一些关于这方面的信息。我习惯于看到处理异常消息的两种方式。首先是一个简单的模式,您可以直接向用户显示消息: try { service.Update(); } catch (Exception ex) { ShowMessage(ex.Message); } try { service.Update(); } catch (NetworkException ex) { ShowMessage("Network is unava

这听起来可能是个愚蠢的问题,但我想收集一些关于这方面的信息。我习惯于看到处理异常消息的两种方式。首先是一个简单的模式,您可以直接向用户显示
消息

try
{
    service.Update();
}
catch (Exception ex)
{
   ShowMessage(ex.Message);
}
try
{
    service.Update();
}
catch (NetworkException ex)
{
    ShowMessage("Network is unavailable.");
}
catch (Exception ex)
{
    ShowMessage("Something went wrong with the update.");
}

处理异常的另一种方法是考虑强类型异常,这意味着然后由“控制器”类(或任何一条代码来处理,而不是将信息推送到用户)解释:

第一种方法要求异常使用的每个消息(无论是由调用代码传递到构造函数中还是在强类型异常中管理)都是“用户就绪”(干净、正确制定和本地化,等等)。第二种方法将此职责转移到控制器代码。另外,它可能需要具有非常特定的强类型异常,以确保每个catch块都能够正确地解释它们

那么,异常类的消息属性(在C#中,Java…)是针对谁的呢?最终用户还是程序员


谢谢,

不,我觉得异常详细信息(消息和堆栈跟踪)最好留给日志处理。通常情况下,异常文本技术性太强,无法向用户显示,并且可能实际提供恶意用户信息,这些信息可能被用于黑客攻击或以其他方式攻击系统

因此,我会为不同的异常选择适当的措辞,这些措辞有意义,但不是实际的技术细节


当然,如果这是一个针对特定技术受众的技术工具,那么这可能会改变一些事情(比如像Toad这样的数据库工具可能会选择显示Oracle异常的详细信息,等等)。但总的来说,我会避免这个问题。

这个问题实际上取决于你的受众是谁以及你想给他们提供什么类型的信息。对于大多数终端用户来说,ex.message将是毫无意义和令人困惑的。但是,如果您是专门为程序员或您自己编写的,那么它可能包含一些有用的信息。

首先,用户永远不会看到任何异常消息

您应该处理您可以预见的所有异常,并给出有用的消息:
“无法加载用户…”
,或者根据他们试图完成的任务,他们可以理解的内容

对于所有未处理的异常,您应该有一条标准的用户友好消息,礼貌地告诉他们出了什么问题,并且可能会显示方法中的错误代码,这对他们和您都没有意义

除此之外,如果您正在记录所有异常(您应该这样做),您可能可以向用户提供错误的日志号,以帮助您跟踪问题


如果合适,如果您无法访问日志/站点,则无论何时发生异常情况,都可以通过电子邮件将其详细信息发送给您自己/支持团队。

这个问题很难回答。但简单的回答是,您应该始终尝试向用户展示他所理解的内容。用户友好的信息是一条必由之路。我认为对于新手用户来说,异常是不够有用的。因此,应该始终尝试向他显示自定义错误消息,并为自己保留异常。它们是用来诊断错误的,您应该有权访问它们而不是用户。

如果您确实想从
异常中暴露某些内容,请使用其
ToString()
方法。它提供了更多更好的内容。另一点需要考虑的是,在程序员与用户直接接触但可能无法直接访问用户的机器的情况下,用户告诉程序员,我得到了一个“FNORD”而不是“WooZLED”。“消息”可能比要求用户查找并通过电子邮件发送日志更容易。到目前为止,所有答案都很好,但让我们选择一个来结束案例。谢谢大家。