Il Try...Catch è (a mio modesto parere), migliore dell'ON ERROR perchè:

- Mettiamo che all'interno del Try hai del codice che può generare un'eccezione e che se la genera manda a monte tutto il resto del Try... non hai problemi, perchè il Try si ferma (mi spiego con un esempio, che è meglio:
codice:
Dim TextBox1 As New TextBox
Dim MiaStringa As String = "PincoPallo"

Try
   Dim Prezzo As Integer = CInt(MiaStringa)
   TextBox1.Text = CStr(Prezzo + 5)
Catch ex As InvalidCastException
   MessageBox.Show(ex.Message)
End Try
In questo caso, se la conversione va a monte, non ho problemi (come mi sembra ce ne siano con ON ERROR, che però non ho mai usato);

- Le eccezioni risalgono lo Stack finchè non trovano un blocco Try...Catch adatto a gestirle. Esempio:
codice:
Private Sub VerificaTry()
        Try
            GeneraEccezione()
        Catch ex As IO.InvalidDataException
            MessageBox.Show("InvalidArgumentException")
        End Try
    End Sub

    Private Sub GeneraEccezione()
        Try
            Throw New IO.IOException
        Catch ex As IO.IOException
            MessageBox.Show("IoException")
        End Try

        Try
            Throw New IO.InvalidDataException
        Catch ex As OverFlowException
            MessageBox.Show("OverFlowException")
        End Try
    End Sub