Giusto, ho letto male... be', puoi sempre risollevare un'eccezione, tipo così:
codice:
public static void Main()
{
     // Ometto la dichiarazione del FileStream per la scrittura del file di log
     try
     {
          Principale1();
          Principale2();
     }
     catch(Exception ex)
     {
          //...
     }
}

public static void Principale1()
{
    try
    {
          funzione2();
          funzione3();
          funzione4();
     }
     catch(Exception ex)
     {
          //qui eventualmente gestisci in qualche modo l'eccezione
          //risolleva l'eccezione
          throw;
     }
}
.
In alternativa puoi dichiarare usare il valore di ritorno di Principale1 come un flag che indichi se si è verificato un errore:
codice:
public static void Main()
{
     // Ometto la dichiarazione del FileStream per la scrittura del file di log
     if(Principale1())
          Principale2();
}

public static bool Principale1()
{
    try
    {
          funzione2();
          funzione3();
          funzione4();
     }
     catch(Exception ex)
     {
          //qui eventualmente gestisci in qualche modo l'eccezione
          return false;
     }
     return true;
}
.