Спираючись на матеріал, описаний в першої частини даної статті, ми продовжимо обговорення теми обробки виключень в Windows x64. І в цій частині ми докладно розглянемо ті області PE образу, які використовуються в процесі обробки винятків. Описуваний матеріал вимагає знання базових понять, таких, як пролог, епілог, кадр функції та розуміння базових процесів, таких, як дії прологу і епілогу, передача параметрів функції і повернення результату функції. Якщо читач не знайомий з вищепереліченим, то перед прочитанням рекомендується ознайомитися з матеріалом з першої частини цієї статті.

Читати далі →

Виключення Windows x64. Як це працює. Частина 1

Раніше ми обговорювали прикладне застосування механізму обробки виключень поза середовища Windows. Тепер ми більш детально розглянемо, як це працює в Windows x64. Матеріал буде описаний послідовно, починаючи з самих основ. Тому багато чого може виявитися вам знайомим, і в цьому випадку такі моменти можна просто пропустити.

Читати далі →

Виключення в UEFI додатку

Будь-якому програмісту, який знайомий з UEFI, відомо, що вбудованого механізму обробки виключень там немає. Мова йде про try/except блоках, які є розширенням Microsoft C/C + + компіляторів. Буває дуже корисно мати такий механізм і в повному обсязі користуватися тими перевагами, які він дає. Тому у даній статті мова піде саме про вирішення цієї проблеми. Також до статті додається повна реалізація механізму з його демонстрацією на базі UEFI програми. Порушені тільки 64х бітні процесори фірми Intel, і в обговоренні маються на увазі тільки вони. Реалізація механізму знаходиться в папці exceptions сховища git за адресою: https://github.com/anatolymik/machineries.git.

Читати далі →

Rust 1.0 винятків не буде

Rust LogoСьогодні Аарон Тюрон — розробник, який нещодавно приєднався до розробки Rust в Mozilla — оголосив про відстрочення реалізації якого-небудь механізму виключень, крім вже існуючого макросу
try!
і типу
Result
, до невизначеного моменту після першого релізу мови програмування Rust.

Це означає, що у Rust 1.0 будуть відсутні виключення першого класу — тобто, повністю інтегровані з іншими фічами мови.

Для обробки помилок в даній момент у Rust існує тип
Result { Ок(value), Err(why) }
та макрос
try!
. Тип
Result
представляє з себе перерахування (enum), схоже на
Option { Some(value), None }
і пов'язане з ним за змістом. Варіант
None
типу
Option
говорить про отстутствии значення, а варіант
Err(why)
типу
Result
уточнює, чому значення відсутня.

Rust пропонує повертати тип
Result
з функцій, щоб передавати значення повернення або причину, по якій значення повернути не вдалося. Макрос
try!
в свою чергу дозволяє автоматично повертати
Err(why)
з поточної функції, якщо інший виклик функції не вдався (застосовується до об'єкта типу
Result
).

Читати далі →