1.che io sappia (per quel poco di esperienza avuta con il try catch) differisce solo dalla parte finally che viene forzatamente eseguita sempre , anche quando nella sezione di codice scritto in try o catch ci metto un exit sub o altri comandi di uscita , non esce dalla struttura se non dopo aver eseguito la parte di codice posta nel finally, mentre non è così per on error....
2. La struttura del try cacth è più ordinata, quella è , e quella rimane, mentre con l'altra non ci sono limiti ( vedasi se aggiungi il comando GOTO) le vie diventano infinite (quasi sempre ti perdi) ...
2.Un'altra differenza con try catch (che io sappia, magari qualcuno più esperto mi smentirà) non è possibile, in caso di errori, riprendere dall'istruzione successiva che ha generato l'errore stesso!!

.. altrA differenzA é una struttura legata al VB.NET, quindi l'abiente che si viene a creare è un sub ambiente , cioè le variabili dichiarate nel try cacth vivono solo in quella struttura...
Per ultimo, ON ERROR RESUME NEXT prova a metterlo dentro un ciclo, e fai sapere cosa succede... è nemico del VB.NET come l'istruzione già soppiantata in VB.NET "GOSUB".... (tra l'altro utilizzata molto in VB normale)

Spero sia stato d'aiuto...