throw_errno.h.xml 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <chapter xml:id="throw_errno.h">
  2. <title><tt>__vic/throw_errno.h</tt></title>
  3. <chapter xml:id="throw_errno">
  4. <title><tt>throw_errno()</tt></title>
  5. <code-block lang="C++"><![CDATA[
  6. [[noreturn]] void throw_errno(const char *prompt);
  7. [[noreturn]] void throw_errno(const char *prompt, int err_no);
  8. ]]></code-block>
  9. <p>Бросает исключение, содержащее глобальное значение <tt>errno</tt> или
  10. данное <tt>err_no</tt>, соответственно. По умолчанию в данный момент типом
  11. исключения будет <xref to="libc_error"/>, однако это можно изменить во время
  12. компоновки переопределением данных функций. Например, можно использовать
  13. <tt>std::system_error</tt>. Для этого просто создайте cpp-файл со следующим
  14. содержимым в своём проекте:</p>
  15. <code-block lang="C++"><![CDATA[
  16. #include<__vic/throw_errno.h>
  17. #include<system_error>
  18. //----------------------------------------------------------------------------
  19. // Override library functions to throw std::system_error
  20. //----------------------------------------------------------------------------
  21. void __vic::throw_errno(const char *prompt, int err_no)
  22. {
  23. throw std::system_error(err_no, std::system_category(), prompt);
  24. }
  25. //----------------------------------------------------------------------------
  26. ]]></code-block>
  27. <p>Переопределения одной функции достаточно, так как вторая просто вызывает
  28. <tt>throw_errno(prompt, errno)</tt>.</p>
  29. <section><title>Пример</title>
  30. <code-block lang="C++"><![CDATA[
  31. ssize_t written = ::write(fd, buf, buf_size);
  32. if(written < 0) __vic::throw_errno("write");
  33. // ...
  34. ]]></code-block>
  35. </section>
  36. </chapter>
  37. </chapter>