Statement Visual C++ .NET

#include "stdafx.h"
using namespace System;
ref class LevelOneException : public ApplicationException{
public:
    LevelOneException( String ^err );
};
LevelOneException::LevelOneException(String ^err) : ApplicationException(err) 
{
}
ref class LevelTwoException : public LevelOneException{
public:
    LevelTwoException( String ^err );
};
LevelTwoException::LevelTwoException(String ^err) : LevelOneException(err)
{
}
void main(){
    for (int i = 0; i < 4; i++){
        try{
            if (i == 1)
                throw gcnew ApplicationException("\tBase Exception Thrown");
            else if (i == 2)
                throw gcnew LevelOneException("\tLevel 1 Exception Thrown");
            else if (i == 3)
                throw gcnew LevelTwoException("\tLevel 2 Exception Thrown");
        }catch (LevelTwoException ^e2){
            Console::WriteLine(e2->Message);
            Console::WriteLine("\tLevel 2 Exception");
        }
        catch (LevelOneException ^e1)
        {
            Console::WriteLine(e1->Message);
            Console::WriteLine("\tLevel 1 Exception");
        }
        catch (ApplicationException ^e)
        {
            Console::WriteLine(e->Message);
            Console::WriteLine("\tBase Exception");
        }
    }
}