类库中的C#异常-事件处理程序



我正在开发一个类库,该类库使用Form来捕获特定的WndProc消息,然后对其进行处理。处理包括文件操作。然后,库将处理后的值发布为公共属性或事件。

问题:当处理抛出异常时,我该怎么办
如果我让它向呼叫者冒出来,它需要在哪里被捕获?因为它不是一个需要调用的函数/方法。

库类:

public event EventHandler<CmmStateChangedEventArgs> CmmStateChanged;
public event EventHandler<MeasurementInfoEventArgs> MeasurementInfoChanged;
public event EventHandler<MeasurementPlanInfoEventArgs> MeasurementPlanInfoChanged;
public MeasurementPlanInfo MeasurementPlanInfo { get; private set; }
public MeasurementInfo MeasurementInfo { get; private set; }
public Status CMMStatus { get; private set; }
// event handler for internal form WndProc event
// _messageForm is a empty invisible form which catches specific WndProc messages and invokes a event if necessary
private async void _messageForm_CMMStateChanged(object sender, CmmStateChangedEventArgs e)
{
// this could throw
var command = await _stateManager.GetCommandFileAsync(Configuration.CMMObserverFolderPath);
var observer = await _stateManager.GetObserverFileAsync(Configuration.CMMObserverFolderPath);
var measInfo = new MeasurementInfo();
switch (e.Status)
{
case Status.Running:
if (command.state == "set_cnc_start")
{
// this could throw if observer is null
measInfo = new MeasurementInfo()
{
MeasurementPlanId = observer.planid,
ControllerType = observer.controllertyp,
DeviceGroup = observer.devicegroup,
FirmwareRevision = observer.firmWareRevision,
OperatorId = observer.operid,
PartNumber = observer.partnbinc,
MeasurementPlanFileName = command.planPath,
};
MeasurementInfo = measInfo;
MeasurementInfoChanged?.Invoke(this, new MeasurementInfoEventArgs() { MeasurementInfo = measInfo });
}
break;
case Status.Finished:
measInfo = new MeasurementInfo()
{
MeasurementPlanId = observer.planid,
ControllerType = observer.controllertyp,
DeviceGroup = observer.devicegroup,
FirmwareRevision = observer.firmWareRevision,
OperatorId = observer.operid,
PartNumber = observer.partnbinc,
ChrFilePath = command.chrPath,
HdrFilePath = command.hdrPath,
FetFilePath = command.fetPath
};
MeasurementInfo = measInfo;
MeasurementInfoChanged?.Invoke(this, new MeasurementInfoEventArgs() { MeasurementInfo = measInfo });
break;
case Status.Paused:
case Status.Stopped:
case Status.Exception:
default:
break;
}
CMMStatus = e.Status;
CmmStateChanged?.Invoke(this, new CmmStateChangedEventArgs() { Status = e.Status });
}

调用类:

public MainForm()
{
InitializeComponent();
apiConfiguration = new ApiConfiguration();
// where catch possible exception ?
api = new Calypso()
.Configure(apiConfiguration)
.Initialize();
api.CmmStateChanged += Api_CmmStateChanged;
api.MeasurementInfoChanged += Api_MeasurementInfoChanged;
api.MeasurementPlanInfoChanged += Api_MeasurementPlanInfoChanged;
}

这取决于情况。哪个作用域可以解释异常并执行操作(API或调用方(?扔的是什么?抛出异常时,是否意味着调用方的状态现在不同步,情况即将恶化?API是否可以尝试解决这样的问题?下一个工作更改事件是否会让呼叫者完全恢复?呼叫者可能对这些"问题"感兴趣吗;周期性故障(?("-也许添加一个消息遗漏事件。

如果异常是严重故障,那么问题是在调用方的何处处理:我建议捕获异常并添加故障事件,那么调用方可以尽其所能做出最佳响应。或者,初始化可以接受要调用的回调操作。

最新更新