if (denominator == 0) { throw std::invalid_argument( "НЕ НАДО ТАК!" ); }
. Теперь, если мне нужно выполнить какой-то кусок кода, в котором есть вызовы функций, из которых могут вылетать исключения, и я хочу как-то локализовать эту проблему и обезопасить от этого остальную программу, то я пишу try { divide(x, 0); } catch (const std::invalid_argument& e) { /* Я все понял, я так больше не буду. */ }
.int divide(int a, int b) { return a / b; }
. И однажды это происходит, кто-то (да я же сам) передает туда ноль и... Что должно произойти в этой ситуации? Я не знаю, CPU не знает, компилятор об этом не позаботился, ОС тоже не знает, но на всякий случай она прихлопнет весь процесс целиком и (возможно) напишет в консоль что-то типа segmentation fault.func setCookies() -> HTTPCookie? {
let cookieProperties: [HTTPCookiePropertyKey : Any] = [HTTPCookiePropertyKey.name: "PerfectCookie",
HTTPCookiePropertyKey.value: "Perfect is awesome",
HTTPCookiePropertyKey.domain: "localhost",
HTTPCookiePropertyKey.secure: false]
return HTTPCookie(properties: cookieProperties)
}
Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -sOutputFile=output.pdf input.pdf
std::string command;
char data1 = 'F';
char data2 = 'C';
command = std::string("color ") + data1 + data2;
system(command.c_str());
void process_array4 (char (&array)[4]) {
for (int i = 0; i < 4; i++)
array[i]++;
}
template <size_t N>
void process_arrayN (char (&array)[N]) {
for (int i = 0; i < N; i++)
array[i]++;
}
fflush(stdin);
scanf("%d%*c", &a);
#include <memory>
template<typename T>
class Stack{
public:
Stack(std::size_t maxSize_): maxSize(maxSize_){}
// Что происходит, когда стек пуст? Можно бросить исключение, или сделать как в std
T pop(){
// if (!tmp) throw ...
auto tmp = std::move(head);
// Обратите внимание, теперь head пуст
head = std::move(tmp->next);
// Теперь tmp->next пуст
--size;
return tmp->value;
}
bool push(T value){
if (size+1 > maxSize)
return false;
// здесь может быть брошено исключение из-за нехватки памяти
std::unique_ptr<Node> tmp(new Node(value));
tmp->next = std::move(head);
head = std::move(tmp);
++size;
return true;
}
private:
struct Node{
T value;
std::unique_ptr<Node> next = nullptr;
Node(T value_) noexcept
: value(value_)
{ }
};
std::unique_ptr<Node> head = nullptr;
std::size_t maxSize;
std::size_t size = 0;
};