To create your own UI or fully automated tool to process Revit Failures, derive a class from this interface. 
   Namespace:   Autodesk.Revit.DB  
  Assembly:   RevitAPI  (in RevitAPI.dll) Version: 2015.0.0.0 (2015.0.0.0) 
Syntax
| C# | 
|---|
|  | 
| Visual Basic | 
|---|
|  | 
| Visual C++ | 
|---|
|  | 
Remarks
 To override Revit default Failures Processing UI, instantiate your own processor derived from this interface and register it in Revit application. 
 Examples
 Copy  C#
 Copy  C# [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
public class MyFailuresUI : IExternalApplication
{
    static AddInId m_appId = new AddInId(new Guid("9F179363-B349-4541-823F-A2DDB2B86AF3"));
    public Result OnStartup(UIControlledApplication application)
    {
        IFailuresProcessor myFailUI = new FailUI();
        //Autodesk.Revit.ApplicationServices.Application.RegisterFailuresProcessor(myFailUI);
        return Result.Succeeded;
    }
    public Result OnShutdown(UIControlledApplication application)
    {
        return Result.Succeeded;
    }
    public class FailUI : IFailuresProcessor
    {
        public void Dismiss(Document document)
        {
            // This method is being called in case of exception or document destruction to 
            // dismiss any possible pending failure UI that may have left on the screen
        }
        public FailureProcessingResult ProcessFailures(FailuresAccessor failuresAccessor)
        {
            IList<FailureResolutionType> resolutionTypeList = new List<FailureResolutionType>();
            IList<FailureMessageAccessor> failList = new List<FailureMessageAccessor>();
            // Inside event handler, get all warnings
            failList = failuresAccessor.GetFailureMessages(); 
            string errorString = "";
            bool hasFailures = false;
            foreach (FailureMessageAccessor failure in failList)
            {
                // check how many resolutions types were attempted to try to prevent
                // entering infinite loop
                resolutionTypeList = failuresAccessor.GetAttemptedResolutionTypes(failure);
                if (resolutionTypeList.Count >= 3)
                {
                    TaskDialog.Show("Error", "Cannot resolve failures - transaction will be rolled back.");
                    return FailureProcessingResult.ProceedWithRollBack;
                }
                errorString += "IDs ";
                foreach (ElementId id in failure.GetFailingElementIds())
                {
                    errorString += id.ToString() + ", ";
                    hasFailures = true;
                }
                errorString += "\nWill be deleted because: " + failure.GetDescriptionText() + "\n";
                failuresAccessor.DeleteElements(failure.GetFailingElementIds() as IList<ElementId>);
            }
            if (hasFailures)
            {
                TaskDialog.Show("Error", errorString);
                return FailureProcessingResult.ProceedWithCommit;
            }
            return FailureProcessingResult.Continue;
        }
    }
} Copy  VB.NET
 Copy  VB.NET <Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)> _
Public Class MyFailuresUI
    Implements IExternalApplication
    Shared m_appId As New AddInId(New Guid("9F179363-B349-4541-823F-A2DDB2B86AF3"))
    Public Function OnStartup(application As UIControlledApplication) As Autodesk.Revit.UI.Result Implements IExternalApplication.OnStartup
        Dim myFailUI As IFailuresProcessor = New FailUI()
        'Autodesk.Revit.ApplicationServices.Application.RegisterFailuresProcessor(myFailUI);
        Return Result.Succeeded
    End Function
    Public Function OnShutdown(application As UIControlledApplication) As Autodesk.Revit.UI.Result Implements IExternalApplication.OnShutdown
        Return Result.Succeeded
    End Function
    Public Class FailUI
        Implements IFailuresProcessor
        Public Sub Dismiss(document As Document) Implements IFailuresProcessor.Dismiss
            ' This method is being called in case of exception or document destruction to 
            ' dismiss any possible pending failure UI that may have left on the screen
        End Sub
        Public Function ProcessFailures(failuresAccessor As FailuresAccessor) As FailureProcessingResult Implements IFailuresProcessor.ProcessFailures
            Dim resolutionTypeList As IList(Of FailureResolutionType) = New List(Of FailureResolutionType)()
            Dim failList As IList(Of FailureMessageAccessor) = New List(Of FailureMessageAccessor)()
            ' Inside event handler, get all warnings
            failList = failuresAccessor.GetFailureMessages()
            Dim errorString As String = ""
            Dim hasFailures As Boolean = False
            For Each failure As FailureMessageAccessor In failList
                ' check how many resolutions types were attempted to try to prevent
                ' entering infinite loop
                resolutionTypeList = failuresAccessor.GetAttemptedResolutionTypes(failure)
                If resolutionTypeList.Count >= 3 Then
                    TaskDialog.Show("Error", "Cannot resolve failures - transaction will be rolled back.")
                    Return FailureProcessingResult.ProceedWithRollBack
                End If
                errorString += "IDs "
                For Each id As ElementId In failure.GetFailingElementIds()
                    errorString += id.ToString() & ", "
                    hasFailures = True
                Next
                errorString += vbLf & "Will be deleted because: " & failure.GetDescriptionText() & vbLf
                failuresAccessor.DeleteElements(TryCast(failure.GetFailingElementIds(), IList(Of ElementId)))
            Next
            If hasFailures Then
                TaskDialog.Show("Error", errorString)
                Return FailureProcessingResult.ProceedWithCommit
            End If
            Return FailureProcessingResult.[Continue]
        End Function
    End Class
End Class