Можем ли мы использовать Try/Catch Within QueuedTask.Run()
Можем ли мы использовать Try/Catch в течение QueuedTask.Run()
?
Я чувствую, что Try/Catch должен быть снаружи QueuedTask.Run()
но у меня нет причин для этого. Пожалуйста, уточните, следует ли держать в или из QueuedTask.Run()
public ICommand CmdEdit
{
get
{
return _cmdEdit ?? (_cmdEdit = new RelayCommand(() =>
{
QueuedTask.Run(() =>
{
try
{
if (_selectedObj != null && SelectedObjs.Count() == 1)
{
OnEditObj(_selectedObj);
}
}
catch (Exception ex)
{
DialogService.ShowPrompt(ex, null, DialogServiceMessage.Message_EditError, DialogServiceCaption.Caption_Exception, DialogServiceButtons.Ok, DialogServiceIcon.Exclamation);
OneGeo.ExceptionLogger.EventLogger.Log(ex);
}
});
}, () => (_selectedObj != null && _selectedObjs.Count() == 1)));
}
}
1 ответ
Если у вас нет причины обращаться с ним снаружи, тогда все в порядке, чтобы обращаться с этим внутри. Вы должны всегда обрабатывать исключения, как только вы сможете правильно их обработать. Так что я бы пошел внутрь.
У меня нет предметных знаний о ArcGIS, но если QueuedTask.Run
может выдавать свои собственные исключения (исключение, которое не генерируется вашим делегатом), вы не поймете их таким образом. Тем не менее, вы должны справиться с этим в любом случае.
Также вам нужно учитывать, QueuedTask.Run
похоже на async
операция. Таким образом, чтобы иметь возможность поймать любое исключение, вам нужно await
это раньше. Если вы не можете, вам необходимо поймать это внутри.
Так что окончательный ответ: это зависит. Это также может быть решение по контексту, как прокомментировал Гленебоб:
Единственная возможная проблема, которую я вижу, это звонить
DialogService.ShowPrompt()
из фоновой темы.
На заметку: Вы должны использовать catch all исключения только в качестве крайней меры. Смотрите это.