Обработка ошибок: Исключения

Коды ошибок в си

Вновь вернемся к нашему примеру функции регистрации пользователя из первой части. Но на этот раз она не будет возвращать код ошибки. Вместо этого она возбудит исключение, если что-то пойдет не так:

Следующий вопрос, который у вас мог возникнуть: «А как организовать передачу информации о контексте, в котором произошла ошибка»? Когда мы использовали простые коды ошибок, у нас для этого было предусмотрено перечисление. Каждый элемент перечисления соответствовал тому или иному типу ошибки. Этот вариант широко распространен и неплохо работает, но он имеет свои ограничения. Например, с помощью одного лишь кода ошибки у нас нет возможности передать дополнительную информацию, чтобы уточнить причину ошибки. В случае же с исключениями у вас появляется выбор. Рассмотрим несколько наиболее очевидных вариантов.

Вариант 1. Коды ошибок. Опять

// Не следует так делать…
if (timer. done)
// Одиночному оператору нужны скобки!
timer. control = TIMER_RESTART;

ПРАВИЛО #2 – Ключевое слово «const»

Ключевое слово const следует использовать:

— для объявления переменных, которые не должны меняться после инициализации,
— для определения передаваемых по ссылке параметров функции, которые не могут быть изменены,
— для определения полей в структурах и объединениях, которые не могут быть изменены
— в качестве альтернативы директиве #define при определении числовых констант.

const unsigned char dirPort = 0xff;

ПРАВИЛО #3 – Ключевое слово «static»

static void InnerFunction( void )
<
….
>

ПРАВИЛО #4 – Ключевое слово «volatile»

Ключевое слово volatile нужно использовать везде, где уместно, включая:

— Объявление глобальной переменной доступной любому обработчику прерываний,
— Объявление глобальной переменной доступной двум или более задачам,
— Объявление указателя к отображаемым в памяти периферийным регистрам ввода/вывода

volatile unsigned int timer;

ПРАВИЛО #5 – Комментарии

// Так делать нельзя.
/*
a = a + 1;
/* comment */
b = b + 1;
*/

// Так правильно.
#if 0
a = a + 1;
/* comment */
b = b + 1;
#endif

ПРАВИЛО #6 – Тип данных с фиксированной разрядностью

ПРАВИЛО #7 – Поразрядные операторы

, ^, <<, и >>) не должен использоваться для управления целочисленными данными со знаком.

ПРАВИЛО #8 – Целые числа со знаком и без

ПРАВИЛО #9 – Параметризированные макросы против inline функций

Не следует использовать параметризированный макрос, если для выполнения той же задачи может быть написана inline функция. <2>

ПРАВИЛО #10 – Оператор-запятая

Оператор запятая (,) не должен использоваться внутри описания переменной.

// Так делать нельзя…
char * x, y; // вы хотите, чтобы «y» был указателем, или нет?

СНОСКИ

Michael Barr «Bug-Killing Coding Standard Rules for Embedded C». Вольный перевод ChipEnable. Ru

Comments

*ушел переписывать все параметризирова нные макросы в инлайн функции*

давно взял себе за правило всегда объявлять все переменные с фиксированной разрядностью (uint8_t, etc.)

Кто знает что есть такая книга :-) хорошо что есть такой сайт! Где можно узнать про книги и не только.

Источники:

https://tech-geek. ru/error-handling-exceptions-in-c/

https://chipenable. ru/index. php/item/62

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: