2012-05-30 36 views
1

我想知道哪个是打印功能的最实用选项。可以说我有一台打印机和一个像这样的打印方法。举办活动或返回布尔?

printerEngine.Print("StuffToPrint",Printer,Qty); 

如果失败了,应该返回一个布尔值(在这种情况下为false)或引发一个PrintingFailed事件。

打印失败事件允许我添加更多的上下文,为什么它失败了,但我不确定最好的处理方式。

回答

3

您可能希望因异常而失败,因为出现异常情况会导致打印作业失败。您可以在异常中包含尽可能多的细节,并在需要的地方处理。也许只有在发生预期会导致作业失败的事情时才使用bool。

看看Eric Lippert的博客文章this关于异常处理,这是一个很好的指导。

+0

我接受了这个答案,因为虽然它与Jon Skeet的作出最终决定的无价之宝相同,欢呼声。 – deanvmc

+0

受宠若惊,为Jon得到答案,我非常尊重...谢谢! – RobertMS

+0

没问题,如果不是因为我提供的链接,我会和Jon一起去的,因为我觉得真的解决了一些推送异常时遇到的问题,我最终使用了TryPrint。 – deanvmc

4

另一个明显的选择是抛出一个异常,就像你试图写入一个文件或类似的东西一样。

该例外可以有你想要的更多细节,并且你可以让它将堆栈上升到最适合的地方来处理它。

如果Print方法,就是要异步的,您不妨考虑返回Task表明成功,失败,完成等(假设你使用.NET 4)。

+0

只是想知道Jon,出于偏好,你更喜欢抛出异常,还是只是放入额外的逻辑来阻止它们,然后以较少的应用程序破坏的方式处理*逻辑异常*根据我读过/看过的内容,我总是认为额外的逻辑是最佳实践。 – mattytommo

+0

我也很想知道这个答案。 – deanvmc

+0

我刚刚参考了Eric Lippert在这个主题上的[本博客](http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx) - 这是一个很好的指南。 – RobertMS

2

这取决于,你想提供为什么它失败的用户,或登录到某种日志?如果你想要做这些事情之一,然后提高事件。

如果您既不想这样做,也只是想确定它是否失败,只需使用bool即可。

1

添加一个bool返回值太简单了,并且无法开始列举所有可能发生的问题。你可能有一些预烘的错误代码......但是,如果你需要它,它仍然不提供任何上下文。

事件没有问题。它允许您返回丰富的信息。但是这两种方法都需要完全不同的编程模型。异常可以在调用它的同一个堆栈线程上处理。可能会在完全不同的环境中调用事件。您可能没有可用的所有信息来正确处理您使用例外时可能发生的故障。 所以这取决于你平衡权衡。