Существует огромная разница в рендеринге.
Предположим, у вас есть строка 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
В Visual C ++ вы можете использовать __declspec (noreturn).
Вы можете добавить фиктивный оператор return после вызова AlwaysThrows () с комментарием, объясняющим, почему он там. Это также полезно, когда вызываемая функция всегда exit () s или abort () s.
Конечно, возникает один вопрос: зачем вам вообще писать такой код? Очевидный ответ на этот вопрос состоит в том, что 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 () не возвращает значение.
Я тоже столкнулся с этой неприятной проблемой. Обычно сценарий включает в себя:
Хотя вы можете поставить фиктивную ошибку. 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
}
Таким образом, вам не нужно добавлять никаких дополнительных строк кода.