Я понимаю, что лучше использовать Dispose() для экземпляров Pen и Brush, за исключением случаев, когда они были установлены на предопределенные системой значения (например, System.Drawing.Brushes, System.Drawing.Pens или System.Drawing.SystemBrushes)
Попытка утилизации системно-определяемого ресурса приводит к тому, что генерируется исключение.
Не кажется очевидным, как вы можете обнаружить (помимо обертывания вызова Dispose() в try/catch), ссылается ли один из этих ресурсов на системное или определяемое пользователем значение.