esatto...in altre parole, la gestione delle eccezioni deve essere "rasoterra"...a meno che la libreria in uso non è progettata apposta, nei suoi metodi, per restituire, che so, -1 dopo aver intercettato una eccezione. in quel caso si puo' gestire l'eccezione anche a livello piu' esterno...

per es, per il login di un utente:

codice:
Namespace CustomExceptions
    Public Class UtenteNonTrovatoException
        Inherits ApplicationException
        Sub New(Optional ByVal message As String = "Utente non trovato in archivio", Optional ByVal inner As Exception = Nothing)
            MyBase.New(message, inner)
        End Sub
    End Class
End Namespace
e nel metodo "login" della classe "utente.vb"

codice:
        .
        .
        .
        Try
            conn.Open()
            cmdLogin.ExecuteNonQuery()

            If cmdLogin.Parameters("@id").Value <> -1 Then
                valoreritorno = 0
            Else
                Throw New CustomExceptions.UtenteNonTrovatoException
            End If
        Catch ex As CustomExceptions.UtenteNonTrovatoException
            Trace.Warn("WARNING: " & ex.Message)
            valoreritorno = -1
        Finally
            conn.Close()
            cmdLogin.Dispose()
            Return valoreritorno
        End Try
e nella pagina aspx che istanzia la classe utente:

codice:
 if utente.login = -1 then response.write("errore nel login")