using System;
using PostSharp.Samples.ExceptionHandling;
 
// Add the AddContextOnException aspect to all methods in the assembly.
 
[assembly: AddContextOnException]
 
namespace PostSharp.Samples.ExceptionHandling
{
  internal class Program
  {
    private static void Main(string[] args)
    {
      MainCore();
 
      // Proofs that MainCore succeeded despite Finbonacci throwing an exception.
      Console.WriteLine("The program returns successfully.");
    }
 
    [ReportAndSwallowException]
    private static void MainCore()
    {
      // The Fibonacci method will fail with an exception, but the [ReportAndSwallowException] aspect
      // will swallow the exception and the MainCore method will succeed.
      Fibonacci(5);
    }
 
    public static int Fibonacci(int n)
    {
      if (n < 0)
        throw new ArgumentOutOfRangeException();
 
      if (n == 0)
        return 0;
      // The next lines are intentionally commented out to cause an exception:
 
      // if (n == 1)
      //    return 1;
 
      return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
  }
}