throw_errno.h.xml 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. #include<cerrno>
  19. namespace __vic {
  20. //----------------------------------------------------------------------------
  21. // Override library functions to throw std::system_error
  22. //----------------------------------------------------------------------------
  23. void throw_errno(const char *prompt, int err_no)
  24. {
  25. throw std::system_error(err_no, std::system_category(), prompt);
  26. }
  27. //----------------------------------------------------------------------------
  28. void throw_errno(const char *prompt)
  29. {
  30. throw_errno(prompt, errno);
  31. }
  32. //----------------------------------------------------------------------------
  33. } // namespace
  34. ]]></code-block>
  35. <section><title>Пример</title>
  36. <code-block lang="C++"><![CDATA[
  37. ssize_t written = ::write(fd, buf, buf_size);
  38. if(written < 0) __vic::throw_errno("write");
  39. // ...
  40. ]]></code-block>
  41. </section>
  42. </chapter>
  43. </chapter>