У меня получилось вот так:
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) вернёт истину