Мне кажется довольно странным полагаться на текст сообщения, когда в нем уже есть код ошибки. В то время как есть некоторые другие проблемы с шаблоном, как обрисовано в общих чертах в других ответах, я бы скорее поискал «23503», а не «ограничение внешнего ключа». В противном случае, что произойдет, если пользовательская база данных будет установлена в другой культуре или обновленная версия сервера изменит текст сообщения?
На самом деле, просматривая некоторую онлайн-документацию , вы используете класс исключений, который выглядит так, как будто есть даже свойство Code, это будет намного быстрее и надежнее по сравнению со свойством сообщения. *
Заключительная мысль ...
Я согласен с Ван, что вы должны генерировать более конкретное исключение, когда ограничение нарушено, но также вы не должны генерировать базовое исключение, когда ошибка является чем-то другим. Во-первых, никогда не рекомендуется создавать базовый класс исключений, поскольку он не предоставляет клиентскому коду легко проверяемую информацию о том, что это за ошибка. Во-вторых, вы теряете много информации, все дополнительные свойства, которые реализует NpgsqlException, плюс трассировка стека. Я бы заменил метание на что-то вроде:
if (ex.Message.Contains("foreign key constraint"))
throw new ConstraintException("Cannot delete this, this record is already referenced on other record(s)");
else
throw;
По сути, если вы не собираетесь делать что-либо продуктивное с исключением, не трогайте его, вы никогда не знаете, какой информационный код может понадобиться для резервного копирования стека вызовов.