Я думаю, що всі відповіді, які пояснюють, що у вас не повинно бути прапора, який контролює, чи є виняток, кинутий чи ні, є хорошими. Їх порада була б моєю порадою для кожного, хто відчуває потребу задати це питання.
Однак я хотів зазначити, що з цього правила є вагомий виняток. Після того, як ви будете достатньо просунуті, щоб почати розробляти API, які використовуватимуть сотні інших людей, є випадки, коли ви можете надати такий прапор. Коли ви пишете API, ви не просто пишете пуристам. Ви пишете справжнім клієнтам, які мають реальні бажання. Частина вашої роботи - зробити їх задоволеними вашим API. Це стає соціальною проблемою, а не проблемою програмування, а іноді соціальні проблеми диктують рішення, які були б менш ідеальними як рішення програм програмування самостійно.
Ви можете виявити, що у вас є два різні користувачі API, один з яких хоче винятків, а один - ні. Приклад із реального життя, де це могло статися, - це бібліотека, яка використовується як при розробці, так і за вбудованою системою. У середовищі розробки користувачі, ймовірно, хочуть мати винятки скрізь. Винятки дуже популярні для вирішення несподіваних ситуацій. Однак вони заборонені у багатьох вбудованих ситуаціях, оскільки вони занадто важкі для аналізу обмежень у реальному часі. Коли ви насправді дбаєте не лише про середній час, який потрібно для виконання вашої функції, але і час, який потрібно для будь-якої однієї індивідуальної забави, ідея розкручувати стек в будь-якому довільному місці дуже небажана.
Приклад із реального життя для мене: бібліотека з математики. Якщо у вашій математичній бібліотеці є Vectorклас, який підтримує отримання одиничного вектора в тому ж напрямку, ви повинні мати змогу ділитися на величину. Якщо величина дорівнює 0, ви маєте поділ на нульову ситуацію. У розвитку ви хочете їх наздогнати . Ви дійсно не хочете, щоб дивовижний поділ на 0 повісився. Кидання винятку - дуже популярне рішення для цього. Це майже ніколи не буває (це справді виняткова поведінка), але коли це відбувається, ти хочеш це знати.
На вбудованій платформі ви не бажаєте цих винятків. Було б більше сенсу зробити перевірку if (this->mag() == 0) return Vector(0, 0, 0);. Насправді я бачу це в реальному коді.
Тепер подумайте з точки зору бізнесу. Ви можете спробувати навчити два різні способи використання API:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
Це задовольняє думки більшості відповідей тут, але з точки зору компанії це небажано. Вбудованим розробникам доведеться вивчити один стиль кодування, а розробникам розробки доведеться вивчити інший. Це може бути досить нудно, і змушує людей до одного способу мислення. Потенційно гірше: як ви хочете довести, що вбудована версія не містить коду, який викидає виняток? Версія для викидання може легко поєднуватися, ховаючись десь у вашому коді, поки дорога рада з перегляду несправностей не знайде її.
Якщо, з іншого боку, у вас є прапор, який вмикає або вимикає обробку винятків, обидві групи можуть вивчити абсолютно однаковий стиль кодування. Насправді, у багатьох випадках ви навіть можете використовувати код однієї групи в проектах іншої групи. У випадку використання цього коду unit(), якщо ви насправді піклуєтесь про те, що відбувається в поділі на 0 випадків, ви повинні самі написати тест. Таким чином, якщо ви перемістите його до вбудованої системи, де ви просто отримуєте погані результати, така поведінка є "розумним". Зараз, з точки зору бізнесу, я колись треную свої кодери, і вони використовують однакові API та однакові стилі у всіх частинах мого бізнесу.
У переважній більшості випадків ви хочете дотримуватися порад інших: використовуйте ідіоми, подібні tryGetUnit()або подібні, для функцій, які не викидають винятки, і натомість повертайте значення дозорного типу null. Якщо ви думаєте, що користувачі, можливо, захочуть використовувати як обробку винятків, так і код виключення для виключення в рамках однієї програми, дотримуйтесь tryGetUnit()позначень. Однак є наріжний випадок, коли реальність бізнесу може полегшити використання прапора. Якщо ви опинитесь у цьому кутовому випадку, не бійтеся підкидати "правила" убік. Ось які правила є!