由于应用程序应该继续运行,因此在调用者眼中这些都不是例外。异常应该总是中止。
我会在内部做类似 .NET 的事情并举办一个活动。
public class ReaderFailedEventArgs : EventArgs
{
public ReaderFailedEventArgs (IReader reader, Exception failure)
{
}
// [.. Two read only properties here ..]
}
public class Worker
{
public event EventHandler<ReaderFailedEventArgs> ReaderFailed = delegate{};
public IEnumerable<Data> Process()
{
foreach (var reader in _readers)
{
try
{
return reader.Read();
}
catch (Exception ex)
{
ReaderFailed(this, new ReaderFailedEventArgs(reader, ex);
}
}
// now, this is a real exception since user expects to get data
throw new InvalidOperationException("All readers failed");
}
}
使用空委托 ( delegate{}
) 分配事件允许我们使用事件而无需检查它是否为空(它也使事件线程安全)。