У меня получилось вот так:
app.ControlledApplication.FailuresProcessing += OnFailuresProcessing;
...
private void OnFailuresProcessing(object sender, FailuresProcessingEventArgs e)
{
var failureAccessor = e.GetFailuresAccessor();
var disjointFailures = failureAccessor
.GetFailureMessages(FailureSeverity.Warning)
.Where(x => x.GetFailureDefinitionId() == BuiltInFailures.JoinElementsFailures.JoiningDisjointWarn)
.ToList();
if (disjointFailures.Count == 0)
return;
foreach (var failure in disjointFailures)
{
failure.SetCurrentResolutionType(FailureResolutionType.DetachElements);
failureAccessor.ResolveFailure(failure);
}
e.SetProcessingResult(FailureProcessingResult.ProceedWithCommit);
}
Разница с твоим случаем - я здесь обрабатываю предупреждение, а не ошибку, на вскидку не вспомнил, что нужно сделать, чтобы выдавало именно ошибку, а не предупреждение.
Соответственно, GetFailureMessages(FailureSeverity.Warning) меняешь на FailureSeverity.Error, а BuiltInFailures.JoinElementsFailures.JoiningDisjointWarn на BuiltInFailures.JoinElementsFailures.JoiningDisjoint.
Дай знать по результатам, есть небольшое сомнение, что будет работать с Error-ом. По-хорошему, я бы ещё проверку добавил, что FailureMessage.HasResolutionOfType(FailureResolutionType.DetachElements) вернёт истину