1
6
通过捕获(…)并调用一个共享处理程序函数来重新调用和分派,避免在每个调用站点复制catch块:
|
2
2
我经常遇到的一个想法是,异常应该被能够处理它们的级别捕获。例如,传输数据的函数可能会捕捉到CRC错误,一旦捕捉到该异常,它可能会尝试重新传输,而“无信号”异常可能会捕捉到更高级别的异常,并中断或延迟整个操作。 但我的猜测是,这些异常中的大多数都会被捕获在同一个函数周围。它 是 单独捕获和处理它们是个好主意(如soln 2),但您认为这会导致大量重复代码(导致soln 3)。 我的问题是,如果有很多代码要重复,为什么不把它变成一个函数呢? 我在考虑…
我想应该是exceptiondispatch()函数,而不是
当然,这个函数过于简化了—您可能需要围绕datahw使用一个完整的包装器类;但我的观点是,最好有一个集中的点来处理所有datahw异常—如果该类的不同用户处理它们的方式相似的话。 |
3
1
也许您可以为datahw类编写一个包装类? 包装器将提供与datahw类相同的功能,但也包含所需的错误处理代码。好处是,您可以将错误处理代码放在一个地方(干燥原则),所有错误都将被统一处理。例如,可以将包装器中的所有低级I/O异常转换为高级异常。 基本上防止向用户显示低级异常。 正如巴特勒·兰普森所说:计算机科学中的所有问题都可以通过另一个间接层次来解决。 |
4
1
有三种方法可以解决这个问题。 正在写入包装函数为每个函数编写一个包装函数,该函数可以引发处理异常的异常。然后,所有调用方调用该包装器,而不是原始的抛出函数。 使用函数对象另一种解决方案是采用更通用的方法,编写一个函数,它接受一个函数对象并处理所有异常。下面是一些例子:
现在,如果你想做点什么,你可以做:
因为您提供了函数对象,所以也可以管理状态。假设senddata更新len,这样它就知道读取了多少字节。然后,您可以编写读取和写入的函数对象,并为到目前为止读取的字符数保持计数。 第二种方法的缺点是不能访问抛出函数的结果值,因为它们是从函数对象包装器调用的。无法轻松获取函数对象绑定器的结果类型。一种解决方法是编写一个结果函数对象,该对象在函数对象执行成功后由ExecuteAndHandle调用。但是,如果我们把太多的工作放在第二种方法上,仅仅是为了让所有的家政工作顺利进行,那么结果就不值得了。 两者结合还有第三种选择。我们可以将这两个解决方案(包装器和函数对象)结合起来。
诀窍是
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
zaen · 将值传递到异常字符串消息中 2 年前 |
Zephyr · 如何在双ListView选择系统上实现过滤器? 6 年前 |
Aave · 错误数组长度的特定异常 6 年前 |