con il throw "trasmetti" l'eccezione alla classe chiamante il metodo...
(la classe chiamante dovrà esser lei a gestire con try e catch il possibile errore...)

invece con try e catch gestisci direttamente l'eccezione nel metodo senza trasmetterlo a chi l'ha invocato...

fondamentalmente è questa la differenza principale...

per esperienza inizialmente usavo sempre il try catch, ma facendo man mano nuovi lavori ho iniziato sempre di più ad utilizzare il throw e ha gestire tutti gli errori dalla classe "chiamante"