Skip to content

Instantly share code, notes, and snippets.

@khellang
Last active December 22, 2015 04:38
Show Gist options
  • Save khellang/6418180 to your computer and use it in GitHub Desktop.
Save khellang/6418180 to your computer and use it in GitHub Desktop.
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
{
pipelines.OnError.AddItemToEndOfPipeline((ctx, ex) =>
{
var exception = ex.GetRootException();
return ctx.Negotiate().WithModel(new Error
{
Message = exception.Message,
Details = exception.ToString()
});
});
}
}
public static class ExceptionExtensions
{
public static Exception GetRootException(this Exception ex)
{
while (ex.InnerException != null)
{
ex = ex.InnerException;
}
return ex;
}
}
public class Error
{
public string Message { get; set; }
public string Details { get; set; }
}
<!DOCTYPE HTML>
<html>
<head>
<title>Nancy - Negotiated Error Handling</title>
</head>
<body>
<h1>@Model.Message</h1>
<p>@Model.Details</p>
</body>
</html>

Accept: application/json

{
    "Message": "ERRORZ!!1",
    "Details": "System.InvalidOperationException: ERRORZ!!1\r\n   at Nancy.Demo.Hosting.Self.TestModule.<.ctor>b__2(Object parameters) in c:\\Users\\Kristian\\Documents\\Code\\Nancy\\src\\Nancy.Demo.Hosting.Self\\TestModule.cs:line 13\r\n   at CallSite.Target(Closure , CallSite , Func`2 , Object )\r\n   at Nancy.Routing.Route.<>c__DisplayClass4.<Wrap>b__3(Object parameters, CancellationToken context) in c:\\Users\\Kristian\\Documents\\Code\\Nancy\\src\\Nancy\\Routing\\Route.cs:line 100"
}

Accept: application/xml

<?xml version="1.0"?>
<Error 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Message>ERRORZ!!1</Message>
    <Details>System.InvalidOperationException: ERRORZ!!1
   at Nancy.Demo.Hosting.Self.TestModule.&lt;.ctor&gt;b__2(Object parameters) in c:\Users\Kristian\Documents\Code\Nancy\src\Nancy.Demo.Hosting.Self\TestModule.cs:line 13
   at CallSite.Target(Closure , CallSite , Func`2 , Object )
   at Nancy.Routing.Route.&lt;&gt;c__DisplayClass4.&lt;Wrap&gt;b__3(Object parameters, CancellationToken context) in c:\Users\Kristian\Documents\Code\Nancy\src\Nancy\Routing\Route.cs:line 100</Details>
</Error>

Accept: text/html

<!DOCTYPE HTML>
<html>
    <head>
        <title>Nancy - Negotiated Error Handling</title>
    </head>
    <body>
        <h1>ERRORZ!!1</h1>
        <p>
            System.InvalidOperationException: ERRORZ!!1
   at Nancy.Demo.Hosting.Self.TestModule.<.ctor>b__2(Object parameters) in c:\Users\Kristian\Documents\Code\Nancy\src\Nancy.Demo.Hosting.Self\TestModule.cs:line 13
   at CallSite.Target(Closure , CallSite , Func`2 , Object )
   at Nancy.Routing.Route.<>c__DisplayClass4.
            <Wrap>b__3(Object parameters, CancellationToken context) in c:\Users\Kristian\Documents\Code\Nancy\src\Nancy\Routing\Route.cs:line 100
        
        </p>
    </body>
</html>
public class TestModule : NancyModule
{
public TestModule()
{
Get["/"] = parameters => {
throw new InvalidOperationException("ERRORZ!!1");
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment