Amigo, apenas o try/catch não é suficiente para que a aplicação "trate" uma exception. Se você nao implementar seu codigo no catch, um erro generico e nada amigavel será disparado.
A função do throw é lançar a exceção para o método chamador, ou seja, leva o erro adiante.
Por exemplo, imagine que sua aplicação chama um serviço, e o erro ocorre na camada na própria camada do serviço, tendo um throw no método, a exception é levada até a aplicação, e assim você pode saber e tratar uma mensagem de erro amigável para o usuário.
Try/catch é uma forma de capturar o exception de forma organizada. Claro que você pode declarar um try/catch com o catch vazio, apesar de não ser uma boa pratica, isto até pode impedir que sua aplicação aborte, dependendo do caso, mas lembre-se que dependendo do contexto, é necessário que a execução seja cancelada em caso de erro e não continue a execução, pelo simples fato de nao poder seguir por conta de dependencia de uma regra.
Pense no try como "programa, tente executar algo" e o catch como "programa, trate desta forma". Quase nunca o erro disparado pela aplicação é facilmente entendido por usuários comuns, cabendo ao desenvolvedor tratar as possíveis exceções e formatar uma mensagem de saída amigável. Isso facilita inclusive na manutenção do código para outros desenvolvedores.
Espero ter ajudado.
Bons estudos.
Você pode obter mais detalhes e exemplos no link abaixo:
https://docs.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/throw
https://docs.microsoft.com/pt-br/dotnet/csharp/programming-guide/exceptions/how-to-handle-an-exception-using-try-catch