Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
19358d1c
Commit
19358d1c
authored
8 years ago
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
util/Exception: add more utility functions
parent
8679074b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
64 additions
and
0 deletions
+64
-0
Exception.hxx
src/util/Exception.hxx
+64
-0
No files found.
src/util/Exception.hxx
View file @
19358d1c
...
...
@@ -30,10 +30,74 @@
#ifndef EXCEPTION_HXX
#define EXCEPTION_HXX
#include "Compiler.h"
#include <exception>
#include <string>
/**
* Throws the specified exception. There is an overload for
* std::exception_ptr which throws the contained exception instead of
* the std::exception_ptr itself.
*/
template
<
typename
T
>
gcc_noreturn
inline
void
ThrowException
(
T
&&
t
)
{
throw
t
;
}
gcc_noreturn
inline
void
ThrowException
(
std
::
exception_ptr
ep
)
{
std
::
rethrow_exception
(
ep
);
}
/**
* Create a nested exception, wrapping #ep inside (a copy of) #t.
*/
template
<
typename
T
>
inline
std
::
exception_ptr
NestException
(
std
::
exception_ptr
ep
,
T
&&
t
)
noexcept
{
try
{
std
::
rethrow_exception
(
ep
);
}
catch
(...)
{
try
{
std
::
throw_with_nested
(
std
::
forward
<
T
>
(
t
));
}
catch
(...)
{
return
std
::
current_exception
();
}
}
}
/**
* Find an instance of #T in the nested exception chain, and rethrow
* it. Does nothing of no such instance was found.
*/
template
<
typename
T
>
inline
void
FindRetrowNested
(
std
::
exception_ptr
ep
)
{
try
{
std
::
rethrow_exception
(
ep
);
}
catch
(
const
T
&
t
)
{
throw
;
}
catch
(
const
std
::
exception
&
e
)
{
try
{
std
::
rethrow_if_nested
(
e
);
}
catch
(...)
{
FindRetrowNested
<
T
>
(
std
::
current_exception
());
}
}
catch
(
const
std
::
nested_exception
&
ne
)
{
FindRetrowNested
<
T
>
(
ne
.
nested_ptr
());
}
catch
(...)
{
}
}
/**
* Obtain the full concatenated message of an exception and its nested
* chain.
*/
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment