Как показать к компилятору, что функция всегда бросает?

Существует огромная разница в рендеринге.

Предположим, у вас есть строка This is a text from an old magazine в контейнере, которая вмещает только 6 символов в строке.

Вывод

word-break: break-all

:

This i
s a te
xt fro
m an o
ld mag
azine

break-all поместит как можно больше символов в строке. Таким образом, это приведет к довольно ужасному результату, поскольку такие слова, как «is», разбиты на 2 строки, когда они могли бы поместиться очень хорошо, если бы они были только переведены на новую строку ». Вот почему я редко использую break-all.

word-wrap: break-word

вывод:

This
is a
text
from
an old
magazi
ne

break-word будет разрывать только те слова, которые слишком длинные, чтобы уместиться в контейнер (например, «журнал», который равен 8 chars, и контейнер вмещает только 6 символов.) Он никогда не нарушит слова, которые могли бы вместить контейнер полностью, вместо этого он перенесет их на новую строку.

<div style="width: 100px; border: solid 1px black; font-family: monospace;">
  <h1 style="word-break: break-all;">This is a text from an old magazine</h1>
  <hr>
  <h1 style="word-wrap: break-word;">This is a text from an old magazine</h1>
</div
9
задан Assaf Lavie 28 June 2009 в 07:59
поделиться

4 ответа

В Visual C ++ вы можете использовать __declspec (noreturn).

4
ответ дан 4 December 2019 в 07:04
поделиться

Вы можете добавить фиктивный оператор return после вызова AlwaysThrows () с комментарием, объясняющим, почему он там. Это также полезно, когда вызываемая функция всегда exit () s или abort () s.

6
ответ дан 4 December 2019 в 07:04
поделиться

Конечно, возникает один вопрос: зачем вам вообще писать такой код? Очевидный ответ на этот вопрос состоит в том, что AlwaysTrows () на самом деле является своего рода функцией сообщения об ошибках. В моем собственном коде я фактически использую макрос для создания отчетов об ошибках, потому что он позволяет мне выполнять форматирование строк и обращаться к макросам standatd __ LINE __ и __ FILE __ . Макрос выглядит примерно так:

#define ATHROW( msg )                                               \
{                                                                   \
    std::ostringstream os_;                                         \
    os_ << msg;                                                     \
    throw ALib::Exception( os_.str(), __LINE__, __FILE__ );         \
}

где конструктор исключения выполняет дополнительное форматирование, дополнительное ведение журнала и т. Д. Побочным эффектом этого, конечно же, является то, что компилятор может видеть, что генерируется исключение, поэтому, когда я говорю что-то вроде :

int f() int val ) {
   if ( val >= BADVALUE ) {
       ATHROW( "Invalid value " << val << " for val" );
   }
   else {
       return val / 3;
   }
}

тогда я не получу предупреждения о том, что f () не возвращает значение.

5
ответ дан 4 December 2019 в 07:04
поделиться

Я тоже столкнулся с этой неприятной проблемой. Обычно сценарий включает в себя:

  1. Есть несколько общих строк кода в нескольких блоках catch, которые я хотел бы реорганизовать.
  2. Все вышеупомянутые блоки catch в конечном итоге повторно генерируют исключение.

Хотя вы можете поставить фиктивную ошибку. return после метода с постоянным выбросом, который, вероятно, оскорбит OCD вашего программиста.

Я использую компромисс, чтобы вместо того, чтобы вызываемый метод генерировал исключение, вместо этого возвращал его. Затем, когда вы вызываете метод, просто выдает возвращаемое значение:

Exception HandleException() 
{ 
    // Do stuff, like some logging maybe
    return SomeException("something"); 
}

bool foo()
{    
   if (cond)        
       throw HandleException();    
   else        
       return true; // no more warning
}

Таким образом, вам не нужно добавлять никаких дополнительных строк кода.

1
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: