Как я могу "Заменить" Исключение своим собственным кодом? - PullRequest
1 голос
/ 14 февраля 2020

Я хотел бы использовать свое собственное catch-исключение при возникновении исключений.

Мой тестовый код такой ...

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Dim sb As System.Text.StringBuilder
            sb.Append("test")

        Catch ex As Exception
            ex.Alert("Yo")

        End Try
    End Sub
End Class


<Serializable>
Public Class Exception
    Inherits System.Exception

    Public Sub Alert(text As String)
        MsgBox(text)
    End Sub

    Public Sub New(message As String)
        MyBase.New(message)
    End Sub

    Public Sub New(message As String, innerException As Exception)
        MyBase.New(message, innerException)
    End Sub

    Public Sub New()
    End Sub

    Protected Sub New(serializationInfo As Runtime.Serialization.SerializationInfo, streamingContext As Runtime.Serialization.StreamingContext)
    End Sub

End Class

Но он не улавливает ошибку.

Как я могу заменить класс "Исключение" своим собственным классом?

1 Ответ

2 голосов
/ 14 февраля 2020

Вы успешно создали пользовательский тип исключения (хотя простое обращение к нему Exception может привести к путанице, вам следует дать ему более конкретное c имя). Но ничто не выбрасывает ваш тип исключения. Ни один из встроенных. NET -кодов не был создан с учетом вашего пользовательского исключения , так что ничто не будет выбрасывать этот тип.

Ваш код может бросить свой тип исключений. Например, создание исключения на основе некоторого условия:

Try
    If someCondition Then
        Throw New Exception()
    End If
Catch ex As Exception
    ex.Alert("Yo")
End Try

Обычно что-то подобное происходит глубже в стеке вызовов, например, в вызываемом вами методе, а не на том же уровне, что и Try/Catch здесь. (Примите во внимание общий совет, что не следует использовать исключения для потока управления, что является своего рода тем, что происходит в этом надуманном примере.)

Но дело в том, что ваш код будет бросать ваш пользовательский исключение, встроенный. NET код, конечно, не будет делать это.

Кроме того, соединение типа исключения с MsgBox эффективно связывает его с определенной технологией пользовательского интерфейса c. Это может быть хорошо для ваших нужд, но это смешанные проблемы, которые, как правило, не должны смешиваться. Само исключение должно просто содержать информацию о проблеме, исключение , обрабатывающее logi c, должно обрабатывать отображение этой информации, или ее регистрацию, или любым способом реагирования на проблему.

В настоящее время этот пользовательский тип исключений ничего не добавляет к информации о проблеме, он только соединяется с пользовательским интерфейсом. Поэтому, когда вы рассматриваете его использование ... Все, что он делает, это заменяет MsgBox, но делает это только в тех местах, где вы также можете использовать MsgBox, так что он фактически ничего не выигрывает. В долгосрочной перспективе вы можете начать в неправильном направлении с точки зрения эффективной обработки исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...