Можешь объяснить механизм обработки ошибок в Swift, включая использование `throws`, `try`, `catch` и протокол `Error`, а также различия между `try`, `try?` и `try!`? — ДейлиПреп