Допустим, у меня есть список объектов одного типа. Я хочу перебрать этот список объектов и выполнить «опасный» метод для каждого из них. Если в этом методе возникает исключение, является ли плохой метод, чтобы сам метод перехватывал исключение и устанавливал свойство ошибки для объекта?
Вот краткий пример, когда метод Start () класса Car перехватывает свое собственное исключение и сохраняет его в свойстве «Problem»:
Sub Main()
// Build cars.
Dim ford As New Car("ford", "1988")
Dim chevy As New Car("chevy", "1992")
Dim honda As New Car("honda", "2002")
// Create a list of cars.
Dim carList As New List(Of Car)
carList.Add(ford)
carList.Add(chevy)
carList.Add(honda)
// Start all of the cars.
For Each c As Car In carList
// I don't want to stop processing if an exception occurs.
// And I don't care to report any errors now.
c.Start()
Next
// other stuff...
// Now report errors.
Dim cr As New CarReport
cr.ReportProblems(carList)
End Sub
Класс, сообщающий о любых проблемах:
Public Class CarReport
Public Sub ReportProblems(ByVal c As List(Of Car))
// Report any problems.
For Each c In carList
If Not String.IsNullOrEmpty(c.Problem) Then
Console.WriteLine(c.Problem)
End If
Next
End Sub
End Class
Простой класс автомобиля:
Public Class Car
Private _make As String
Private _year As String
Private _problem As String = String.Empty
Public Sub New(ByVal make As String, ByVal year As String)
_make = make
_year = year
End Sub
Public Sub Start()
Try
// Do something that could throw an exception.
Catch ex As Exception
_problem = "Car would not start."
End Try
End Sub
Public ReadOnly Property Problem() As String
Get
Return _problem
End Get
End Property
End Class
РЕДАКТИРОВАТЬ: Что если вызывающий (то есть, Sub Main()
выше) поймал исключение и затем установить свойство Problem для объекта Car? Это кажется чище. Что мне действительно нужно сделать, так это сохранить текст ошибки с конкретным объектом Car, чтобы его можно было передавать в другую систему для создания отчетов.
Примечание: Автомобильный сценарий является тривиальным примером для иллюстрации сценария, я не особо задумывался над дизайном класса.