Catch означает, что вы можете обработать исключение.
Вы должны ловить исключения, когда вы можете справиться с условием и сделать что-то полезное. В противном случае вы должны позволить ему пузыриться в стеке вызовов, и, возможно, кто-то выше вас справится с этим. В некоторых приложениях есть обработчики исключений, которые не обрабатываются для обработки на самом внешнем уровне, но в целом, если вы не знаете, что у вас есть какой-то полезный способ справиться с этим, отпустите.
throw new означает, что вы создаете ошибку, которую кто-то выше вас может захотеть отловить. Помните, что вызывающие абоненты могут захотеть обработать / перехватить вашу ошибку, поэтому не выбрасывайте новые «Exception» или «ApplicationException» - генерируйте определенный тип исключения, который наследуется от исключения, чтобы пользователь знал, что он обрабатывает.
И последнее, но не менее важное: убедитесь, что исключения являются исключительными. Не бросайте, если это не исключительная ошибка. Например, код, который проверяет, существует ли что-то, не должен выбрасывать и ловить - это приводит к поломке отладчика и стоит дорого, если его часто вызывать. В нашей команде мы всегда ищем код, который будет работать без ошибок.
Вот похожий пост:
Попытка понять исключения в C #