异常或错误代码


12

我们正在构建一个Web服务(SOAP,.Net),该服务将与(大多数)本地客户端(Windows,C ++)进行通信,并且我们想知道将错误传达给客户端的最佳方法是什么(例如,不提供登录服务的SomethingBadHappened或类似未找到用户的内容),并且无法决定是向客户端抛出异常还是使用某种错误代码模型来执行上述操作。

您希望在客户端上进行处理的是:接收错误代码或处理包含错误原因的ServerFault异常?
1)我们为什么想例外:因为它将使服务器端代码有很多更均匀
2)为什么我们都在思考错误代码:因为我们认为它使从客户端的角度更有意义。

如果2)确实是真的,我们可能会想使用错误代码而不是异常代码?是这样吗?

另外,如果我们与托管客户而不是本地客户进行交谈,答案是否会改变?


只是为了澄清一下:a)我在这里寻找最佳实践并从客户端获得经验(因为客户端要复杂得多,如果我们可以简化客户端代码,我们宁愿在服务器端进行处理)b)客户端包含许多遗留代码,我们可能会也可能无法使用C ++异常。
阿米特·瓦德瓦

这可能会有所帮助-www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

Answers:


8

SOAP具有故障的概念,您可以在服务器端将异常转换为故障,而在客户端代理上,可以再次将故障转换回异常。在WCF和Java Metro堆栈中,这非常有效,无法在本机C ++客户端上进行注释。

关于SOA最佳实践,只有在客户需要以不同方式处理某种类型的错误时,才定义一个通用错误,而很少定义特定错误。切勿在生产部署中向客户端发送异常堆栈跟踪。这是因为从理论上讲,服务器跟踪对客户端和安全性都没有意义。在服务器上记录完整的错误和stacktrace,并在故障中发送对日志的唯一引用。在WCF中,我使用企业库中的Microsoft异常处理块来生成GUID,并将异常转换为SOAP错误。

查看Microsoft模式和实践中的指南。


谢谢,听起来不错。您能给我一个更具体的链接吗?
阿米特·瓦德瓦

也谈像UserNotFound等业务层面的错误又该这些也可以作为例外处理
阿米特·瓦德华

在过去的项目中,我们从未使用代码中的异常或SOAP中的Faults来传达合法/预期的失败模式。我们使用错误代码,然后由客户自行决定如何处理它们。未找到用户实际上不是错误/异常,这可能应该是状态码。
MrLane 2014年

4

最近,我使用Java 6库进行了一项Web服务,该服务可以将异常报告给调用者(我没有研究如何自动完成)。

让客户端在错误报告中向开发人员提供堆栈跟踪的功能非常有用(如果要获取近似的时间戳,然后在日志中查找它,则必须将其记录下来)。

因此,从开发人员的角度来看,请使用异常。


1
我同意这在dogfood和beta中可能很有用,但是您是否真的想在实际使用中在事件日志或日志文件中散出堆栈跟踪信息(当然,还有比该过程需要/想要更多的服务细节) )
阿米特·瓦德瓦

2
@Amit,请相信我:如果您遇到在生产中提供堆栈跟踪的情况,则您希望堆栈跟踪!

1
在客户端进行堆栈跟踪有什么好处,我们肯定会将所有异常记录在服务器端,然后再传递给客户端。
阿米特·瓦德瓦

也谈像UserNotFound等业务层面的错误又该这些也可以作为例外处理
阿米特·瓦德华

-2

如果是Web服务,则不能完全导致服务器引发客户端将捕获的异常。在该接口上,服务器基本上必须返回某种错误代码,即使该字符串表示为An exception occurred. Type %s, message %s, stack trace %s

至于客户端,您可以让您的响应阅读代码检查响应,以查看响应是否包含错误并在客户端引发异常。至少在具有良好异常处理能力的语言中,这是一种非常好的方法。但是,C ++没有很好的异常处理,因此最好远离C ++异常。如果您无法使用更好的语言,请坚持使用错误代码。


我想未捕获的异常将作为ServerFault传递给客户端
Amit Wadhwa

3
C ++或C ++异常没有错。对于某些项目,有很多原因使用C ++以外的语言,但是异常处理不是其中之一。
KeithB

这不仅违反安全性最佳实践:客户端应如何处理服务器的堆栈跟踪?打印并发送给您?以电子邮件发送?使用润滑油纸吗?
JensG 2013年

@JensG:如果这是Web服务而不是网站,则客户端应足够专业,可以将其作为错误报告通过电子邮件发送给您。
梅森惠勒2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.