From c2c1728a5bc8a608673bfc0bc93f17c65493ec8d Mon Sep 17 00:00:00 2001 From: Emil Dotchevski Date: Thu, 21 Jun 2012 02:15:19 +0000 Subject: [PATCH] Documentation update. [SVN r79025] --- doc/source/boost-exception.reno | 2612 +++++++++++++++---------------- 1 file changed, 1306 insertions(+), 1306 deletions(-) diff --git a/doc/source/boost-exception.reno b/doc/source/boost-exception.reno index 90dfa3a..2e36d55 100644 --- a/doc/source/boost-exception.reno +++ b/doc/source/boost-exception.reno @@ -62,18 +62,19 @@ - <string>Motivation</string> + <string>exception types as simple semantic tags</string> - motivation + - 7 + 1 2 - (:include include:) (:auto also explicit=" - 1 + (:include include:) (:auto also:) + + 0 @@ -85,17 +86,28 @@ - 0 + 2 + 21027A2B73C9AA6FF083752A952D63BBA9B5FD68A3C8915965A7184EA62A5D61 + 1523356166 + 537 + 607 + 24256E1CE56594FB38D0630858B8947191827CFC57771E8727A6A56F76207454 + 665917505 + 66 + 26 - 1 + 0 + ../../../../boost/exception/errinfo_errno.hpp + 0 + 0 - <string>exception types as simple semantic tags</string> + <string>errinfo_errno</string> @@ -103,9 +115,11 @@ + 1 2 - - 1 + (:include include:) (:auto also:) + + 0 @@ -113,45 +127,6 @@ reno_context - - - - - 1 - C95CEF2E9D0BAA1E950509471062916DB849A46A19F7692BA478030E79B338EB - 1917376632 - 706 - 408 - - - - - 0 - ../../example/enable_error_info.cpp - 0 - 0 - - - - - <string>integrating boost exception in existing exception class hierarchies</string> - - - tutorial_enable_error_info - - - - - 2 - - 1 - - 0 - - 8 - - reno_context - @@ -166,24 +141,14 @@ - <string>frequently asked questions</string> + <string>page index</string> - + page_idx - 2 - ":) - - - - 0 - - -7 - - 1 2 (:include include:) (:auto also:) @@ -192,18 +157,7 @@ 0 - -8 - - - 1 - 2 - (:include include:) (:auto also:) - - - - 0 - - 9 + 8 reno_context @@ -238,6 +192,51 @@ 0 + + + 0 + + 9 + + reno_context + + + + + + 2 + 9A4ECF9A49A73AED83C1565CB8C67AE1519E8AFE6818F968B4C4733CB9E86CEF + 1615599655 + 68 + 321 + 34F0583BC8DE767CE2D79721E1F956895E43E5397473B1050F59BE7E26C773DB + 805836816 + 66 + 1 + + + + + 0 + ../../../../boost/exception/error_info.hpp + 0 + 0 + + + + + <string>boost/exception/error_info.hpp</string> + + + + + + + + 1 + 2 + (:include include:) (:auto also:) + 0 @@ -250,35 +249,20 @@ - 3 - EFEF19E7D10F02079DA9799E42DA1415CA0C815E964E88CF1A8896D49C81EC22 - 2916767056 - 11964 - 527 - E0D734FE11CFB52F1BBF35C31E84A098AC93881DEE300CDBE3F9B772F75D9B2F - 4056200131 - 2307 - 4436 - A94129EFD6ABBDDCD4CFDB671821F7DA103B2EA4455CF39E783D333C236D1C41 - 1035445969 - 595 - 204 + 0 - 0 - ../../../../boost/exception/exception.hpp - 0 - 0 + 1 - <string>exception::exception</string> + <string>frequently asked questions</string> - exception_constructors + @@ -348,32 +332,42 @@ - 1 - DB156E6A8ACB9FB90C8FB110FC25A5FEB14A619F82EEC47FF913373592E5CC3E - 240075319 - 6209 - 412 + 3 + EFEF19E7D10F02079DA9799E42DA1415CA0C815E964E88CF1A8896D49C81EC22 + 2916767056 + 11964 + 527 + E0D734FE11CFB52F1BBF35C31E84A098AC93881DEE300CDBE3F9B772F75D9B2F + 4056200131 + 2307 + 4436 + A94129EFD6ABBDDCD4CFDB671821F7DA103B2EA4455CF39E783D333C236D1C41 + 1035445969 + 595 + 204 0 - ../../example/example_io.cpp + ../../../../boost/exception/exception.hpp 0 0 - <string>diagnostic_information example</string> + <string>exception::exception</string> - + exception_constructors - 0 + 1 + 2 + (:include include:) (:auto also:) @@ -383,182 +377,6 @@ reno_context - - - - - 2 - 21027A2B73C9AA6FF083752A952D63BBA9B5FD68A3C8915965A7184EA62A5D61 - 1523356166 - 537 - 607 - 24256E1CE56594FB38D0630858B8947191827CFC57771E8727A6A56F76207454 - 665917505 - 66 - 26 - - - - - 0 - ../../../../boost/exception/errinfo_errno.hpp - 0 - 0 - - - - - <string>errinfo_errno</string> - - - - - - - - 1 - 2 - (:include include:) (:auto also:) - - - - 0 - - 14 - - reno_context - - - - - - 2 - 6FB85B536F965F137409D5B5D34786DCBF0B9957A7C251D271B717A1156B823D - 1090406464 - 362 - 527 - D16DAEA8B1792A019AF7FCA362FDC6EFD381AF4C43C076A01C029ECE51F994A6 - 3172941848 - 330 - 26 - - - - - 0 - ../../../../boost/exception/current_exception_cast.hpp - 0 - 0 - - - - - <string>current_exception_cast</string> - - - - - - - - 1 - 2 - (:include include:) (:auto also:) - - - - 0 - - 15 - - reno_context - - - - - - 1 - 790A065B0168021FAD180E996254E3CDBC0360D22D3FCB83C143416663D85402 - 1376868984 - 262 - 323 - - - - - 0 - ../../../../boost/exception/errinfo_nested_exception.hpp - 0 - 0 - - - - - <string>boost/exception/errinfo_nested_exception.hpp</string> - - - - - - - - 1 - 2 - (:include include:) (:auto also:) - - - - 0 - - 16 - - reno_context - - - - - - 2 - 9A4ECF9A49A73AED83C1565CB8C67AE1519E8AFE6818F968B4C4733CB9E86CEF - 1615599655 - 68 - 321 - 34F0583BC8DE767CE2D79721E1F956895E43E5397473B1050F59BE7E26C773DB - 805836816 - 66 - 1 - - - - - 0 - ../../../../boost/exception/error_info.hpp - 0 - 0 - - - - - <string>boost/exception/error_info.hpp</string> - - - - - - - - 1 - 2 - (:include include:) (:auto also:) - - - - 0 - - 17 - - reno_context - @@ -600,7 +418,184 @@ 0 - -6 + 14 + + reno_context + + + + + + 1 + 790A065B0168021FAD180E996254E3CDBC0360D22D3FCB83C143416663D85402 + 1376868984 + 262 + 323 + + + + + 0 + ../../../../boost/exception/errinfo_nested_exception.hpp + 0 + 0 + + + + + <string>boost/exception/errinfo_nested_exception.hpp</string> + + + + + + + + 1 + 2 + (:include include:) (:auto also:) + + + + 0 + + 15 + + reno_context + + + + + + 0 + + + + + 1 + + + + + <string>Motivation</string> + + + motivation + + + + + 7 + 2 + (:include include:) (:auto also explicit=" + 1 + + 0 + + -5 + + + 2 + + 1 + + 0 + + 16 + + reno_context + + + + + + 1 + C95CEF2E9D0BAA1E950509471062916DB849A46A19F7692BA478030E79B338EB + 1917376632 + 706 + 408 + + + + + 0 + ../../example/enable_error_info.cpp + 0 + 0 + + + + + <string>integrating boost exception in existing exception class hierarchies</string> + + + tutorial_enable_error_info + + + + + 2 + + 1 + + 0 + + -10 + + + 2 + ":) + + + + 0 + + -16 + + + 1 + 2 + (:include include:) (:auto also:) + + + + 0 + + 17 + + reno_context + + + + + + 2 + 6FB85B536F965F137409D5B5D34786DCBF0B9957A7C251D271B717A1156B823D + 1090406464 + 362 + 527 + D16DAEA8B1792A019AF7FCA362FDC6EFD381AF4C43C076A01C029ECE51F994A6 + 3172941848 + 330 + 26 + + + + + 0 + ../../../../boost/exception/current_exception_cast.hpp + 0 + 0 + + + + + <string>current_exception_cast</string> + + + + + 1 @@ -619,27 +614,32 @@ - 0 + 1 + DB156E6A8ACB9FB90C8FB110FC25A5FEB14A619F82EEC47FF913373592E5CC3E + 240075319 + 6209 + 412 - 1 + 0 + ../../example/example_io.cpp + 0 + 0 - <string>page index</string> + <string>diagnostic_information example</string> - page_idx + - 1 - 2 - (:include include:) (:auto also:) + 0 @@ -744,10 +744,10 @@ 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 1D5E771272B020A105B69E186517499873571F62AFF9D48F130C952CFAA12FA3 2841506107 891 @@ -873,14 +873,14 @@ 3 - 99DDC29B8C4D366F7A5A5819117AF190E5255231DD9313E1CC0D56BCD9D89BAA - 2051148095 - 1039 + 848BC9161A49BA440F51BAB9C6CCED5C93500327C8741BF5EFA9831C9D690F51 + 2291535325 + 1060 548 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C 2825495330 622 - 411 + 432 98B33BE76679E3A4831241335CD5DFF6F634429F36BABF96C1D4DC2296C5ECC5 1584672077 208 @@ -971,14 +971,14 @@ 2 - 99DDC29B8C4D366F7A5A5819117AF190E5255231DD9313E1CC0D56BCD9D89BAA - 2051148095 - 1039 + 848BC9161A49BA440F51BAB9C6CCED5C93500327C8741BF5EFA9831C9D690F51 + 2291535325 + 1060 548 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C 2825495330 622 - 411 + 432 @@ -1424,13 +1424,13 @@ 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - 9F11D7474EC88DFA37767E996BA42734E62AB37A18E65A63C5EE693D54833757 - 1443641808 - 227 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + 10E31FFA267B250065A2630D0B7107862920D940AEA0A5499D5341A902AE01FF + 1524325002 + 368 13033 @@ -1669,9 +1669,9 @@ 1 - C498A25F0A090E3F3AC45CE36D0E22AFD01FA3B08ABA516D5434C557F35AD72B - 2497908578 - 14924 + FCAB376A7BB77331C1D5DF08FF08A05BAB40B43F12C0A4B9B2A8253131D7B333 + 3011653711 + 15066 321 @@ -1710,10 +1710,10 @@ 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 EEDBDE62A278D2AF428D9D1ED2ABCFF06163BACD91E12DD033565C7043354B89 246173488 248 @@ -1869,10 +1869,10 @@ 3 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 97DB2EDAA38019314BA1A582664F8950F5208310F14BAB94E1880AE2C5F00CD4 3076716310 959 @@ -2068,10 +2068,10 @@ 3 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 2482DDAF6A7E31CF75E93B993C86D9814A0B8899B68E555B23D411BD195FE270 1574307697 8349 @@ -2988,14 +2988,14 @@ 3 - 99DDC29B8C4D366F7A5A5819117AF190E5255231DD9313E1CC0D56BCD9D89BAA - 2051148095 - 1039 + 848BC9161A49BA440F51BAB9C6CCED5C93500327C8741BF5EFA9831C9D690F51 + 2291535325 + 1060 548 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C 2825495330 622 - 411 + 432 38B566F2C6678B8724D18086A6F76E077DC2ADC1BB69A4B83BF0A2C3B7D31B50 2218658069 31 @@ -3112,10 +3112,10 @@ 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 0066D4E6E6B189906E6DE04F08509F3737511701A1B1355B37511EC18E8371F4 2078296250 305 @@ -3247,6 +3247,35 @@ 0 + + + 0 + + -6 + + + 5 + 2 + [@typedef + 1 + + 0 + + -26 + + + 2 + <struct errinfo_errno_,int> + 1 + + 0 + + -6 + + + 2 + ;@] + 0 @@ -3308,27 +3337,7 @@ -13 - 5 - 2 - [@typedef - 1 - - 0 - - -26 - - - 2 - <struct errinfo_errno_,int> - 1 - - 0 - - -13 - - - 2 - ;@] + 0 @@ -3366,15 +3375,6 @@ 0 - - - 0 - - -6 - - - 0 - 0 @@ -3501,7 +3501,7 @@ 0 - -10 + -12 2 @@ -3548,7 +3548,7 @@ 0 - -17 + -13 2 @@ -4181,6 +4181,15 @@ 0 + + + 0 + + -6 + + + 0 + 0 @@ -4206,7 +4215,18 @@ -9 - 0 + 3 + 2 + [@(:include + 1 + + 0 + + -26 + + + 2 + decl:)@] @@ -4251,15 +4271,6 @@ -14 - 0 - - - - 0 - - -15 - - 3 2 [@(:include @@ -4277,27 +4288,7 @@ 0 - -16 - - - 3 - 2 - [@(:include - 1 - - 0 - - -26 - - - 2 - decl:)@] - - - - 0 - - -17 + -15 0 @@ -4306,7 +4297,16 @@ 0 - -6 + -16 + + + 0 + + + + 0 + + -17 0 @@ -4851,7 +4851,7 @@ 0 - -14 + -17 2 @@ -5158,7 +5158,7 @@ 0 - -16 + -9 2 @@ -5275,7 +5275,7 @@ 0 - -15 + -14 2 @@ -5313,7 +5313,7 @@ 0 - -13 + -6 2 @@ -5351,6 +5351,15 @@ 0 + + + 0 + + -6 + + + 0 + 0 @@ -5385,36 +5394,7 @@ -10 - 7 - 2 - [@(:link - 1 - - 0 - - -10 - - - 2 - mod="m":)(); (:link - 1 - - 0 - - -10 - - - 2 - mod="m":)( (:link - 1 - - 0 - - -25 - - - 2 - :) const & x );@] + 0 @@ -5452,7 +5432,36 @@ -12 - 0 + 7 + 2 + [@(:link + 1 + + 0 + + -12 + + + 2 + mod="m":)(); (:link + 1 + + 0 + + -12 + + + 2 + mod="m":)( (:link + 1 + + 0 + + -25 + + + 2 + :) const & x );@] @@ -5461,7 +5470,27 @@ -13 - 0 + 5 + 2 + [@(:link + 1 + + 0 + + -13 + + + 2 + mod="m":)( (:link + 1 + + 0 + + -75 + + + 2 + mod="m":) const & v );@] @@ -5470,18 +5499,7 @@ -14 - 3 - 2 - [@template <class E> E * - 1 - - 0 - - -14 - - - 2 - ();@] + 0 @@ -5508,9 +5526,9 @@ -17 - 5 + 3 2 - [@(:link + [@template <class E> E * 1 0 @@ -5519,25 +5537,7 @@ 2 - mod="m":)( (:link - 1 - - 0 - - -75 - - - 2 - mod="m":) const & v );@] - - - - 0 - - -6 - - - 0 + ();@] @@ -6536,9 +6536,9 @@ -5 - 33 + 7 2 - (:auto !!!:) Traditionally, when using exceptions to report failures, the throw site: *creates an exception object of the appropriate type, and *stuffs it with data relevant to the detected error. A higher context in the program contains a catch statement which: *selects failures based on exception types, and *inspects exception objects for data required to deal with the problem. The main issue with this "traditional" approach is that often, the data available at the point of the throw is insufficient for the catch site to handle the failure. Here is an example of a catch statement: [@catch( file_read_error & e ) { std::cerr << e.file_name(); }@] And here is a possible matching throw: [@void read_file( FILE * f ) { .... size_t nr=fread(buf,1,count,f); if( ferror(f) ) throw file_read_error(???); .... }@] Clearly, the problem is that the handler requires a file name but the read_file function does not have a file name to put in the exception object; all it has is a FILE pointer! In an attempt to deal with this problem, we could modify read_file to accept a file name: [@void read_file( FILE * f, char const * name ) { .... size_t nr=fread(buf,1,count,f); if( ferror(f) ) throw file_read_error(name); .... }@] This is not a real solution: it simply shifts the burden of supplying a file name to the immediate caller of the read_file function. ->''In general, the data required to handle a given library-emitted exception depends on the program that links to it. Many contexts between the throw and the catch may have relevant information which must be transported to the exception handler.'' !!!Exception wrapping The idea of exception wrapping is to catch an exception from a lower level function (such as the read_file function above), and throw a new exception object that contains the original exception (and also carries a file name.) This method seems to be particularly popular with C++ programmers with Java background. Exception wrapping leads to the following problems: *To wrap an exception object it must be copied, which may result in slicing. *Wrapping is practically impossible to use in generic contexts. The second point is actually special case of violating the exception neutrality principle. Most contexts in a program can not handle exceptions; such contexts should not interfere with the process of exception handling. !!!The boost::exception solution *Simply derive your exception types from boost::(:link + (:auto !!!:) Deriving from boost::(:link 1 0 @@ -6547,7 +6547,7 @@ 2 - :). *Confidently limit the throw site to provide only data that is available naturally. *Use exception-neutral contexts between the throw and the catch to augment exceptions with more relevant data as they bubble up. For example, in the throw statement below we only add the errno code, since this is the only failure-relevant information available in this context: [@struct exception_base: virtual std::exception, virtual boost::(:link + :) effectively decouples the semantics of a failure from the information that is relevant to each individual instance of reporting a failure with a given semantic. In other words: with boost::(:link 1 0 @@ -6556,7 +6556,27 @@ 2 - :) { }; struct io_error: virtual exception_base { }; struct file_read_error: virtual io_error { }; typedef boost::(:link + :), what data a given exception object transports depends primarily on the context in which failures are reported (not on its type.) Since exception types need no members, it becomes very natural to throw exceptions that derive from more than one type to indicate multiple appropriate semantics: [@struct exception_base: virtual std::exception, virtual boost::(:link + 1 + + 0 + + -25 + + + 2 + :) { }; struct io_error: virtual exception_base { }; struct file_error: virtual io_error { }; struct read_error: virtual io_error { }; struct file_read_error: virtual file_error, virtual read_error { };@] Using this approach, exception types become a simple tagging system for categorizing errors and selecting failures in exception handlers. + + + + 0 + + -6 + + + 7 + 2 + (:auto !!!:) (:include synopsis:) This type is designed to be used as a standard (:link 1 0 @@ -6565,16 +6585,7 @@ 2 - :)<struct tag_errno_code,int> errno_code; void read_file( FILE * f ) { .... size_t nr=fread(buf,1,count,f); if( ferror(f) ) throw file_read_error() (:link - 1 - - 0 - - -11 - - - 2 - |<<:) errno_code(errno); .... }@] In a higher exception-neutral context, we add the file name to ''any'' exception that derives from boost::(:link + :) instance for transporting a relevant errno value in exceptions deriving from boost::(:link 1 0 @@ -6583,106 +6594,16 @@ 2 - :): [@typedef boost::(:link + :). !!!Example: (:include 1 0 - -26 + -60 2 - :)<struct tag_file_name,std::string> file_name; .... try { if( FILE * fp=fopen("foo.txt","rt") ) { shared_ptr<FILE> f(fp,fclose); .... read_file(fp); //throws types deriving from boost::(:link - 1 - - 0 - - -25 - - - 2 - :) do_something(); .... } else throw file_open_error() (:link - 1 - - 0 - - -11 - - - 2 - |<<:) errno_code(errno); } catch( boost::(:link - 1 - - 0 - - -25 - - - 2 - :) & e ) { e (:link - 1 - - 0 - - -11 - - - 2 - |<<:) file_name("foo.txt"); throw; }@] Finally here is how the handler retrieves data from exceptions that derive from boost::(:link - 1 - - 0 - - -25 - - - 2 - :): [@catch( io_error & e ) { std::cerr << "I/O Error!\n"; if( std::string const * fn=(:link - 1 - - 0 - - -20 - - - 2 - :)<file_name>(e) ) std::cerr << "File name: " << *fn << "\n"; if( int const * c=(:link - 1 - - 0 - - -20 - - - 2 - :)<errno_code>(e) ) std::cerr << "OS says: " << strerror(*c) << "\n"; }@] In addition, boost::(:link - 1 - - 0 - - -34 - - - 2 - :) can be used to compose an automatic (if not user-friendly) message that contains all of the (:link - 1 - - 0 - - -26 - - - 2 - :) objects added to a boost::(:link - 1 - - 0 - - -25 - - - 2 - :). This is useful for inclusion in logs and other diagnostic objects. + :) @@ -6691,36 +6612,20 @@ -7 - 27 + 1 2 - (:auto !!:) Some exception hierarchies can not be modified to make boost::(:link - 1 + (:auto !:) This is an alphabetical list of all Boost Exception documentation pages. (:pagelist fmt="index" except_tags="index noindex" mod="w":) + + 0 - -25 + -8 + 17 2 - :) a base type. In this case, the (:link - 1 - - 0 - - -54 - - - 2 - :) function template can be used to make exception objects derive from boost::(:link - 1 - - 0 - - -25 - - - 2 - :) anyway. Here is an example: [@#include <(:link + (:auto !!!:) The following example demonstrates how errno can be stored in exception objects using Boost Exception: [@#include <(:link 1 0 @@ -6729,7 +6634,7 @@ 2 - :)> #include <stdexcept> typedef boost::(:link + :)> #include <iostream> typedef boost::(:link 1 0 @@ -6738,43 +6643,7 @@ 2 - :)<struct tag_std_range_min,size_t> std_range_min; typedef boost::(:link - 1 - - 0 - - -26 - - - 2 - :)<struct tag_std_range_max,size_t> std_range_max; typedef boost::(:link - 1 - - 0 - - -26 - - - 2 - :)<struct tag_std_range_index,size_t> std_range_index; template <class T> class my_container { public: size_t size() const; T const & operator[]( size_t i ) const { if( i > size() ) throw boost::(:link - 1 - - 0 - - -54 - - - 2 - :)(std::range_error("Index out of range")) << std_range_min(0) << std_range_max(size()) << std_range_index(i); //.... } }; @] The call to (:link - 1 - - 0 - - -54 - - - 2 - :)<T> gets us an object of ''unspecified type'' which is guaranteed to derive from both boost::(:link + :)<struct tag_my_info,int> my_info; //(1) struct my_error: virtual boost::(:link 1 0 @@ -6783,7 +6652,25 @@ 2 - :) and T. This makes it possible to use (:link + :), virtual std::exception { }; //(2) void f() { throw my_error() << my_info(42); //(3) }@] First, we instantiate the (:link + 1 + + 0 + + -26 + + + 2 + :) template using a unique identifier -- tag_my_info, and the type of the info it identifies -- int. This provides compile-time type safety for the various values stored in exception objects. Second, we define class my_error, which derives from boost::(:link + 1 + + 0 + + -25 + + + 2 + :). Finally, (3) illustrates how the typedef from (1) can be used with (:link 1 0 @@ -6792,31 +6679,42 @@ 2 - mod="/":) to store additional information in the exception object. The exception can be intercepted as T &, so existing exception handling will not break. It can also be intercepted as boost::(:link + |operator<<:) to store values in exception objects at the point of the throw. The stored my_info value can be recovered at a later time like this: [@// ...continued void g() { try { f(); } catch( my_error & x ) { if( int const * mi=boost::(:link 1 0 - -25 + -20 2 - :) &, so that (:link + :)<my_info>(x) ) std::cerr << "My info: " << *mi; } }@] The (:link 1 0 - -73 + -20 2 - |more information can be added to the exception at a later time:). + :) function template is instantiated with the typedef from (1), and is passed an exception object of a polymorphic type. If the exception object contains the requested value, err will point to it; otherwise a null pointer is returned. 0 - -8 + -9 + + + 1 + 2 + (:auto !!:) !!!Synopsis (:include synopsis:) + + + + 0 + + -10 81 @@ -7024,7 +6922,7 @@ 0 - -13 + -6 2 @@ -7183,127 +7081,6 @@ 2 :) wrapper, a std::bad_alloc could propagate instead. This behavior seems undesirable to some programmers. Bjarne Stroustrup, The C++ Programming Language, 3rd Edition, page 371: ->''"Throwing an exception requires an object to throw. A C++ implementation is required to have enough spare memory to be able to throw bad_alloc in case of memory exhaustion. However, it is possible that throwing some other exception will cause memory exhaustion."'' Therefore, the language itself does not guarantee that an attempt to throw an exception is guaranteed to throw an object of the specified type; propagating a std::bad_alloc seems to be a possibility even outside of the scope of Boost Exception. - - - 0 - - -9 - - - 17 - 2 - (:auto !!!:) The following example demonstrates how errno can be stored in exception objects using Boost Exception: [@#include <(:link - 1 - - 0 - - -77 - - - 2 - :)> #include <iostream> typedef boost::(:link - 1 - - 0 - - -26 - - - 2 - :)<struct tag_my_info,int> my_info; //(1) struct my_error: virtual boost::(:link - 1 - - 0 - - -25 - - - 2 - :), virtual std::exception { }; //(2) void f() { throw my_error() << my_info(42); //(3) }@] First, we instantiate the (:link - 1 - - 0 - - -26 - - - 2 - :) template using a unique identifier -- tag_my_info, and the type of the info it identifies -- int. This provides compile-time type safety for the various values stored in exception objects. Second, we define class my_error, which derives from boost::(:link - 1 - - 0 - - -25 - - - 2 - :). Finally, (3) illustrates how the typedef from (1) can be used with (:link - 1 - - 0 - - -11 - - - 2 - |operator<<:) to store values in exception objects at the point of the throw. The stored my_info value can be recovered at a later time like this: [@// ...continued void g() { try { f(); } catch( my_error & x ) { if( int const * mi=boost::(:link - 1 - - 0 - - -20 - - - 2 - :)<my_info>(x) ) std::cerr << "My info: " << *mi; } }@] The (:link - 1 - - 0 - - -20 - - - 2 - :) function template is instantiated with the typedef from (1), and is passed an exception object of a polymorphic type. If the exception object contains the requested value, err will point to it; otherwise a null pointer is returned. - - - - 0 - - -10 - - - 7 - 2 - (:auto !!!:) (:include decl:) !!!!Effects: * Default constructor: initializes an empty boost::(:link - 1 - - 0 - - -25 - - - 2 - :) object. * Copy constructor: initializes a boost::(:link - 1 - - 0 - - -25 - - - 2 - :) object which shares ownership with x of all data added through (:link - 1 - - 0 - - -11 - - - 2 - mod="/":), including data that is added at a future time. !!!!Throws: Nothing. - 0 @@ -7349,6 +7126,369 @@ -12 + 7 + 2 + (:auto !!!:) (:include decl:) !!!!Effects: * Default constructor: initializes an empty boost::(:link + 1 + + 0 + + -25 + + + 2 + :) object. * Copy constructor: initializes a boost::(:link + 1 + + 0 + + -25 + + + 2 + :) object which shares ownership with x of all data added through (:link + 1 + + 0 + + -11 + + + 2 + mod="/":), including data that is added at a future time. !!!!Throws: Nothing. + + + + 0 + + -13 + + + 3 + 2 + (:auto !!!:) (:include synopsis:) !!!!Effects: Stores a copy of v in the + 1 + + 0 + + -26 + + + 2 + object. (:include throws:) + + + + 0 + + -14 + + + 1 + 2 + (:auto !!:) !!!Synopsis (:include synopsis:) + + + + 0 + + -15 + + + 33 + 2 + (:auto !!!:) Traditionally, when using exceptions to report failures, the throw site: *creates an exception object of the appropriate type, and *stuffs it with data relevant to the detected error. A higher context in the program contains a catch statement which: *selects failures based on exception types, and *inspects exception objects for data required to deal with the problem. The main issue with this "traditional" approach is that often, the data available at the point of the throw is insufficient for the catch site to handle the failure. Here is an example of a catch statement: [@catch( file_read_error & e ) { std::cerr << e.file_name(); }@] And here is a possible matching throw: [@void read_file( FILE * f ) { .... size_t nr=fread(buf,1,count,f); if( ferror(f) ) throw file_read_error(???); .... }@] Clearly, the problem is that the handler requires a file name but the read_file function does not have a file name to put in the exception object; all it has is a FILE pointer! In an attempt to deal with this problem, we could modify read_file to accept a file name: [@void read_file( FILE * f, char const * name ) { .... size_t nr=fread(buf,1,count,f); if( ferror(f) ) throw file_read_error(name); .... }@] This is not a real solution: it simply shifts the burden of supplying a file name to the immediate caller of the read_file function. ->''In general, the data required to handle a given library-emitted exception depends on the program that links to it. Many contexts between the throw and the catch may have relevant information which must be transported to the exception handler.'' !!!Exception wrapping The idea of exception wrapping is to catch an exception from a lower level function (such as the read_file function above), and throw a new exception object that contains the original exception (and also carries a file name.) This method seems to be particularly popular with C++ programmers with Java background. Exception wrapping leads to the following problems: *To wrap an exception object it must be copied, which may result in slicing. *Wrapping is practically impossible to use in generic contexts. The second point is actually special case of violating the exception neutrality principle. Most contexts in a program can not handle exceptions; such contexts should not interfere with the process of exception handling. !!!The boost::exception solution *Simply derive your exception types from boost::(:link + 1 + + 0 + + -25 + + + 2 + :). *Confidently limit the throw site to provide only data that is available naturally. *Use exception-neutral contexts between the throw and the catch to augment exceptions with more relevant data as they bubble up. For example, in the throw statement below we only add the errno code, since this is the only failure-relevant information available in this context: [@struct exception_base: virtual std::exception, virtual boost::(:link + 1 + + 0 + + -25 + + + 2 + :) { }; struct io_error: virtual exception_base { }; struct file_read_error: virtual io_error { }; typedef boost::(:link + 1 + + 0 + + -26 + + + 2 + :)<struct tag_errno_code,int> errno_code; void read_file( FILE * f ) { .... size_t nr=fread(buf,1,count,f); if( ferror(f) ) throw file_read_error() (:link + 1 + + 0 + + -11 + + + 2 + |<<:) errno_code(errno); .... }@] In a higher exception-neutral context, we add the file name to ''any'' exception that derives from boost::(:link + 1 + + 0 + + -25 + + + 2 + :): [@typedef boost::(:link + 1 + + 0 + + -26 + + + 2 + :)<struct tag_file_name,std::string> file_name; .... try { if( FILE * fp=fopen("foo.txt","rt") ) { shared_ptr<FILE> f(fp,fclose); .... read_file(fp); //throws types deriving from boost::(:link + 1 + + 0 + + -25 + + + 2 + :) do_something(); .... } else throw file_open_error() (:link + 1 + + 0 + + -11 + + + 2 + |<<:) errno_code(errno); } catch( boost::(:link + 1 + + 0 + + -25 + + + 2 + :) & e ) { e (:link + 1 + + 0 + + -11 + + + 2 + |<<:) file_name("foo.txt"); throw; }@] Finally here is how the handler retrieves data from exceptions that derive from boost::(:link + 1 + + 0 + + -25 + + + 2 + :): [@catch( io_error & e ) { std::cerr << "I/O Error!\n"; if( std::string const * fn=(:link + 1 + + 0 + + -20 + + + 2 + :)<file_name>(e) ) std::cerr << "File name: " << *fn << "\n"; if( int const * c=(:link + 1 + + 0 + + -20 + + + 2 + :)<errno_code>(e) ) std::cerr << "OS says: " << strerror(*c) << "\n"; }@] In addition, boost::(:link + 1 + + 0 + + -34 + + + 2 + :) can be used to compose an automatic (if not user-friendly) message that contains all of the (:link + 1 + + 0 + + -26 + + + 2 + :) objects added to a boost::(:link + 1 + + 0 + + -25 + + + 2 + :). This is useful for inclusion in logs and other diagnostic objects. + + + + 0 + + -16 + + + 27 + 2 + (:auto !!:) Some exception hierarchies can not be modified to make boost::(:link + 1 + + 0 + + -25 + + + 2 + :) a base type. In this case, the (:link + 1 + + 0 + + -54 + + + 2 + :) function template can be used to make exception objects derive from boost::(:link + 1 + + 0 + + -25 + + + 2 + :) anyway. Here is an example: [@#include <(:link + 1 + + 0 + + -77 + + + 2 + :)> #include <stdexcept> typedef boost::(:link + 1 + + 0 + + -26 + + + 2 + :)<struct tag_std_range_min,size_t> std_range_min; typedef boost::(:link + 1 + + 0 + + -26 + + + 2 + :)<struct tag_std_range_max,size_t> std_range_max; typedef boost::(:link + 1 + + 0 + + -26 + + + 2 + :)<struct tag_std_range_index,size_t> std_range_index; template <class T> class my_container { public: size_t size() const; T const & operator[]( size_t i ) const { if( i > size() ) throw boost::(:link + 1 + + 0 + + -54 + + + 2 + :)(std::range_error("Index out of range")) << std_range_min(0) << std_range_max(size()) << std_range_index(i); //.... } }; @] The call to (:link + 1 + + 0 + + -54 + + + 2 + :)<T> gets us an object of ''unspecified type'' which is guaranteed to derive from both boost::(:link + 1 + + 0 + + -25 + + + 2 + :) and T. This makes it possible to use (:link + 1 + + 0 + + -11 + + + 2 + mod="/":) to store additional information in the exception object. The exception can be intercepted as T &, so existing exception handling will not break. It can also be intercepted as boost::(:link + 1 + + 0 + + -25 + + + 2 + :) &, so that (:link + 1 + + 0 + + -73 + + + 2 + |more information can be added to the exception at a later time:). + + + + 0 + + -17 + + + 1 + 2 + (:auto !!!:) (:include synopsis:) !!!!Requirements: This function must not be called outside of a catch block. !!!!Returns: A pointer of type E to the current exception object, or null if the current exception object can not be converted to E *. !!!!Throws: Nothing. + + + + 0 + + -18 + + 11 2 !!!!Example: this is a possible output from the (:link @@ -7374,7 +7514,7 @@ 0 - -13 + -6 2 @@ -7398,146 +7538,6 @@ 2 :)_ *] = rb@] - - - 0 - - -13 - - - 7 - 2 - (:auto !!!:) (:include synopsis:) This type is designed to be used as a standard (:link - 1 - - 0 - - -26 - - - 2 - :) instance for transporting a relevant errno value in exceptions deriving from boost::(:link - 1 - - 0 - - -25 - - - 2 - :). !!!Example: (:include - 1 - - 0 - - -60 - - - 2 - :) - - - - 0 - - -14 - - - 1 - 2 - (:auto !!!:) (:include synopsis:) !!!!Requirements: This function must not be called outside of a catch block. !!!!Returns: A pointer of type E to the current exception object, or null if the current exception object can not be converted to E *. !!!!Throws: Nothing. - - - - 0 - - -15 - - - 1 - 2 - (:auto !!:) !!!Synopsis (:include synopsis:) - - - - 0 - - -16 - - - 1 - 2 - (:auto !!:) !!!Synopsis (:include synopsis:) - - - - 0 - - -17 - - - 3 - 2 - (:auto !!!:) (:include synopsis:) !!!!Effects: Stores a copy of v in the - 1 - - 0 - - -26 - - - 2 - object. (:include throws:) - - - - 0 - - -6 - - - 7 - 2 - (:auto !!!:) Deriving from boost::(:link - 1 - - 0 - - -25 - - - 2 - :) effectively decouples the semantics of a failure from the information that is relevant to each individual instance of reporting a failure with a given semantic. In other words: with boost::(:link - 1 - - 0 - - -25 - - - 2 - :), what data a given exception object transports depends primarily on the context in which failures are reported (not on its type.) Since exception types need no members, it becomes very natural to throw exceptions that derive from more than one type to indicate multiple appropriate semantics: [@struct exception_base: virtual std::exception, virtual boost::(:link - 1 - - 0 - - -25 - - - 2 - :) { }; struct io_error: virtual exception_base { }; struct file_error: virtual io_error { }; struct read_error: virtual io_error { }; struct file_read_error: virtual file_error, virtual read_error { };@] Using this approach, exception types become a simple tagging system for categorizing errors and selecting failures in exception handlers. - - - - 0 - - -18 - - - 1 - 2 - (:auto !:) This is an alphabetical list of all Boost Exception documentation pages. (:pagelist fmt="index" except_tags="index noindex" mod="w":) - 0 @@ -7830,7 +7830,7 @@ 0 - -13 + -6 2 @@ -8016,7 +8016,7 @@ 0 - -16 + -9 2 @@ -8034,7 +8034,7 @@ 0 - -16 + -9 2 @@ -8052,7 +8052,7 @@ 0 - -16 + -9 2 @@ -8300,7 +8300,7 @@ 0 - -5 + -15 2 @@ -8318,7 +8318,7 @@ 0 - -7 + -16 2 @@ -8336,7 +8336,7 @@ 0 - -6 + -5 2 @@ -8507,7 +8507,7 @@ 0 - -14 + -17 2 @@ -8570,7 +8570,7 @@ 0 - -8 + -10 2 @@ -8579,7 +8579,7 @@ 0 - -18 + -7 2 @@ -8752,7 +8752,7 @@ 0 - -12 + -18 2 @@ -8790,7 +8790,7 @@ 0 - -16 + -9 2 @@ -8799,7 +8799,7 @@ 0 - -16 + -9 2 @@ -9060,7 +9060,7 @@ 0 - -15 + -14 2 @@ -9069,7 +9069,7 @@ 0 - -15 + -14 2 @@ -9237,7 +9237,7 @@ 0 - -6 + -5 2 @@ -9304,7 +9304,7 @@ 0 - -13 + -6 2 @@ -10047,7 +10047,7 @@ 0 - -12 + -18 2 @@ -10307,7 +10307,7 @@ 0 - -13 + -6 2 @@ -10352,7 +10352,7 @@ 0 - -13 + -6 2 @@ -10783,7 +10783,7 @@ 0 - -9 + -8 2 @@ -10968,7 +10968,7 @@ 0 - -13 + -6 2 @@ -11024,6 +11024,15 @@ 0 + + + 0 + + -6 + + + 0 + 0 @@ -11087,7 +11096,9 @@ -13 - 0 + 1 + 2 + !!!!Throws: Any exception emitted by v's copy constructor. @@ -11123,17 +11134,6 @@ -17 - 1 - 2 - !!!!Throws: Any exception emitted by v's copy constructor. - - - - 0 - - -6 - - 0 @@ -11728,6 +11728,35 @@ 0 + + + 0 + + -6 + + + 5 + 2 + `#include < + 1 + + 0 + + -79 + + + 2 + > (:include + 1 + + 0 + + -79 + + + 2 + synopsis:) + 0 @@ -11753,7 +11782,9 @@ -9 - 0 + 1 + 2 + [@namespace boost { (:include api pre_indent="4":) }@] @@ -11800,27 +11831,18 @@ -13 - 5 + 3 2 - `#include < + `#include <(:link 1 0 - -79 + -57 2 - > (:include - 1 - - 0 - - -79 - - - 2 - synopsis:) + :)> [@(:include decl:)@] @@ -11829,26 +11851,6 @@ -14 - 3 - 2 - `#include < - 1 - - 0 - - -55 - - - 2 - > [@namespace boost { (:include decl pre_indent="4":) }@] - - - - 0 - - -15 - - 5 2 [@#include <(:link @@ -11856,7 +11858,7 @@ 0 - -16 + -9 2 @@ -11871,6 +11873,15 @@ 2 decl pre_indent="4":) (:include api pre_indent="4":) }@] + + + 0 + + -15 + + + 0 + 0 @@ -11878,9 +11889,7 @@ -16 - 1 - 2 - [@namespace boost { (:include api pre_indent="4":) }@] + 0 @@ -11891,25 +11900,16 @@ 3 2 - `#include <(:link + `#include < 1 0 - -57 + -55 2 - :)> [@(:include decl:)@] - - - - 0 - - -6 - - - 0 + > [@namespace boost { (:include decl pre_indent="4":) }@] @@ -12112,7 +12112,7 @@ 0 - -16 + -9 2 @@ -12152,7 +12152,7 @@ 0 - -16 + -9 2 @@ -12315,7 +12315,7 @@ 0 - -16 + -9 2 @@ -12422,7 +12422,7 @@ 0 - -16 + -9 2 @@ -12482,7 +12482,7 @@ 0 - -16 + -9 2 @@ -12689,7 +12689,7 @@ 0 - -15 + -14 2 @@ -12698,7 +12698,7 @@ 0 - -15 + -14 2 @@ -12718,7 +12718,7 @@ 0 - -16 + -9 2 @@ -12974,7 +12974,7 @@ 0 - -16 + -9 2 @@ -13010,6 +13010,9 @@ -5 + + -6 + -7 @@ -13043,9 +13046,6 @@ -17 - - -6 - -18 @@ -13297,7 +13297,7 @@ - -18 + -7 @@ -13342,7 +13342,7 @@ - -5 + -15 @@ -13372,7 +13372,7 @@ - -6 + -5 @@ -13387,7 +13387,7 @@ - -8 + -10 @@ -13484,7 +13484,7 @@ - -15 + -14 @@ -13702,7 +13702,7 @@ - -10 + -12 @@ -13835,28 +13835,6 @@ -40 - - - - 1 - C498A25F0A090E3F3AC45CE36D0E22AFD01FA3B08ABA516D5434C557F35AD72B - 2497908578 - 14924 - 321 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -43 - - @@ -13879,6 +13857,28 @@ -57 + + + + 1 + FCAB376A7BB77331C1D5DF08FF08A05BAB40B43F12C0A4B9B2A8253131D7B333 + 3011653711 + 15066 + 321 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -43 + + @@ -13924,7 +13924,7 @@ - -14 + -17 @@ -13946,7 +13946,7 @@ - -12 + -18 @@ -14019,170 +14019,6 @@ -30 - - - - 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - 9F11D7474EC88DFA37767E996BA42734E62AB37A18E65A63C5EE693D54833757 - 1443641808 - 227 - 13033 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -37 - - - - - - 3 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - 2482DDAF6A7E31CF75E93B993C86D9814A0B8899B68E555B23D411BD195FE270 - 1574307697 - 8349 - 4068 - 7E162EB263369C2C485D5F69CA1A4FADD3EEBC6EB78CE7A767A8615885178079 - 1179386730 - 5404 - 2935 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -53 - - - - - - 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - EEDBDE62A278D2AF428D9D1ED2ABCFF06163BACD91E12DD033565C7043354B89 - 246173488 - 248 - 1396 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -44 - - - - - - 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - 1D5E771272B020A105B69E186517499873571F62AFF9D48F130C952CFAA12FA3 - 2841506107 - 891 - 173 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -21 - - - - - - 3 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - 97DB2EDAA38019314BA1A582664F8950F5208310F14BAB94E1880AE2C5F00CD4 - 3076716310 - 959 - 2974 - 1760DA943E0DCAE6DDB000F3C08D6E6F5F8AEDBBEAC7CAA84A2ED60BFA4B0E1A - 702729709 - 815 - 145 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -48 - - - - - - 2 - 64A91889D0B296F554DB50496EF8036489999CD3C9A8BC181CCE1C1FD37EBB4B - 265554338 - 14135 - 1010 - 0066D4E6E6B189906E6DE04F08509F3737511701A1B1355B37511EC18E8371F4 - 2078296250 - 305 - 1066 - - - - - 0 - ../../../../boost/exception/detail/exception_ptr.hpp - 0 - 0 - - - - -78 - - @@ -14231,6 +14067,92 @@ -23 + + + + 2 + 848BC9161A49BA440F51BAB9C6CCED5C93500327C8741BF5EFA9831C9D690F51 + 2291535325 + 1060 + 548 + 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C + 2825495330 + 622 + 432 + + + + + 0 + ../../../../boost/exception/detail/error_info_impl.hpp + 0 + 0 + + + + -26 + + + + + + 3 + 848BC9161A49BA440F51BAB9C6CCED5C93500327C8741BF5EFA9831C9D690F51 + 2291535325 + 1060 + 548 + 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C + 2825495330 + 622 + 432 + 38B566F2C6678B8724D18086A6F76E077DC2ADC1BB69A4B83BF0A2C3B7D31B50 + 2218658069 + 31 + 143 + + + + + 0 + ../../../../boost/exception/detail/error_info_impl.hpp + 0 + 0 + + + + -75 + + + + + + 3 + 848BC9161A49BA440F51BAB9C6CCED5C93500327C8741BF5EFA9831C9D690F51 + 2291535325 + 1060 + 548 + 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C + 2825495330 + 622 + 432 + 98B33BE76679E3A4831241335CD5DFF6F634429F36BABF96C1D4DC2296C5ECC5 + 1584672077 + 208 + 259 + + + + + 0 + ../../../../boost/exception/detail/error_info_impl.hpp + 0 + 0 + + + + -24 + + @@ -14298,7 +14220,7 @@ - -17 + -13 @@ -14354,7 +14276,7 @@ - -13 + -6 @@ -14531,6 +14453,170 @@ -29 + + + + 3 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + 2482DDAF6A7E31CF75E93B993C86D9814A0B8899B68E555B23D411BD195FE270 + 1574307697 + 8349 + 4068 + 7E162EB263369C2C485D5F69CA1A4FADD3EEBC6EB78CE7A767A8615885178079 + 1179386730 + 5404 + 2935 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -53 + + + + + + 2 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + EEDBDE62A278D2AF428D9D1ED2ABCFF06163BACD91E12DD033565C7043354B89 + 246173488 + 248 + 1396 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -44 + + + + + + 2 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + 1D5E771272B020A105B69E186517499873571F62AFF9D48F130C952CFAA12FA3 + 2841506107 + 891 + 173 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -21 + + + + + + 3 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + 97DB2EDAA38019314BA1A582664F8950F5208310F14BAB94E1880AE2C5F00CD4 + 3076716310 + 959 + 2974 + 1760DA943E0DCAE6DDB000F3C08D6E6F5F8AEDBBEAC7CAA84A2ED60BFA4B0E1A + 702729709 + 815 + 145 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -48 + + + + + + 2 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + 0066D4E6E6B189906E6DE04F08509F3737511701A1B1355B37511EC18E8371F4 + 2078296250 + 305 + 1066 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -78 + + + + + + 2 + ABF06C946BB6C9EDF3D0AFF183E9BE47F78714B7955E0E8FC8252F1B4DA00B7E + 2288396892 + 14276 + 1011 + 10E31FFA267B250065A2630D0B7107862920D940AEA0A5499D5341A902AE01FF + 1524325002 + 368 + 13033 + + + + + 0 + ../../../../boost/exception/detail/exception_ptr.hpp + 0 + 0 + + + + -37 + + @@ -14642,7 +14728,7 @@ - -9 + -8 @@ -14667,92 +14753,6 @@ -27 - - - - 2 - 99DDC29B8C4D366F7A5A5819117AF190E5255231DD9313E1CC0D56BCD9D89BAA - 2051148095 - 1039 - 548 - 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C - 2825495330 - 622 - 411 - - - - - 0 - ../../../../boost/exception/detail/error_info_impl.hpp - 0 - 0 - - - - -26 - - - - - - 3 - 99DDC29B8C4D366F7A5A5819117AF190E5255231DD9313E1CC0D56BCD9D89BAA - 2051148095 - 1039 - 548 - 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C - 2825495330 - 622 - 411 - 38B566F2C6678B8724D18086A6F76E077DC2ADC1BB69A4B83BF0A2C3B7D31B50 - 2218658069 - 31 - 143 - - - - - 0 - ../../../../boost/exception/detail/error_info_impl.hpp - 0 - 0 - - - - -75 - - - - - - 3 - 99DDC29B8C4D366F7A5A5819117AF190E5255231DD9313E1CC0D56BCD9D89BAA - 2051148095 - 1039 - 548 - 12EE98255E53951EE44D5D95A0506693E9F5F9D371505F490B8C0676EB383C7C - 2825495330 - 622 - 411 - 98B33BE76679E3A4831241335CD5DFF6F634429F36BABF96C1D4DC2296C5ECC5 - 1584672077 - 208 - 259 - - - - - 0 - ../../../../boost/exception/detail/error_info_impl.hpp - 0 - 0 - - - - -24 - - @@ -14890,7 +14890,7 @@ - -7 + -16 @@ -14916,7 +14916,7 @@ - -16 + -9 @@ -14992,16 +14992,25 @@ 0 - -7 + -6 - tutorial + error_info_instance noalso type 0 - -9 + -7 + + + + + + + 0 + + -8 noalso noindex tutorial @@ -15010,10 +15019,10 @@ 0 - -10 + -9 - function + @@ -15028,16 +15037,7 @@ 0 - -13 - - - error_info_instance noalso type - - - - 0 - - -14 + -12 function @@ -15046,16 +15046,7 @@ 0 - -16 - - - - - - - 0 - - -17 + -13 function member @@ -15064,10 +15055,19 @@ 0 - -18 + -16 - + tutorial + + + + 0 + + -17 + + + function