Что произойдет, если код внутри улова потерпит неудачу - PullRequest
2 голосов
/ 18 января 2012

Используя код c # в веб-приложении, в моем коде есть оператор try catch, и в рамках catch я хочу сделать несколько вещей, таких как электронная почта администратора.

Мне интересно, что произойдет, если код электронной почты или другой код в улове потерпит неудачу? Есть ли способ обработки общего исключения в приложении?

Ответы [ 9 ]

4 голосов
/ 18 января 2012

Описание

  1. Есть две вещи, которые вы можете сделать, чтобы поймать необработанные исключения. Application.ThreadException и AppDomain.CurrentDomain.UnhandledException

    Application.ThreadException Происходит при возникновении исключения для ненагруженного потока.

    AppDomain.CurrentDomain.UnhandledException Происходит, когда исключение не перехвачено.

  2. Обрабатывать исключение внутри блока catch.

Пример

  1. Application.ThreadException и AppDomain.CurrentDomain.UnhandledException

    Application.ThreadException +=
        new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    
    AppDomain.CurrentDomain.UnhandledException += 
         new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    
  2. Обрабатывать исключение внутри блока catch.

    try
    {
        // do something
    } 
    catch (Exception ex)
    {
        try
        {
            // send E-Mail
        } 
        catch
        {
            // handle 
        }   
    }
    

Дополнительная информация

1 голос
/ 18 января 2012

это для приложения Windows

 static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;

                Application.ThreadException += Application_ThreadException;
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            }
            static void Application_ThreadException(Object sender, ThreadExceptionEventArgs e)
            {
                MessageBox.Show(e.Exception.Message, "Application.ThreadException");
            }

            static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
            {
                MessageBox.Show(((Exception)e.ExceptionObject).Message, "AppDomain.UnhandledException");
            }
1 голос
/ 18 января 2012

Мне интересно, что произойдет, если код электронной почты или другой код внутри перехвата завершится неудачей?

Исключение, выданное в catch, будет обработано обработчиком по умолчанию CLR, если оно не включенов другой try-catch паре.

Однако finally будет определенно исполняться.так что вы можете использовать его для очистки или закрытия ресурсов.

Есть ли способ обработки общего исключения в приложении?

в методе main, напишите следующий кодчасть:

try
{
    // write normal code
}
catch(Exception e)
{
    // if here exception occurs ... God Help.
}
1 голос
/ 18 января 2012

Если исключение выдается в блоке catch, оно будет распространено обычным образом, как исключения.

Вам понадобится следующий код:

try 
{
  //code 
}
catch (SomeKindOfError e1)
{
    try 
    {
       // send email
    }
    catch (EmailError e2)
    {

    }
}

Ваше исключение будет перехвачено любым внешним блоком, на который оно имеет право, например, если у вас есть:

try 
{
   // ...
   try {
      //code 
   }
   catch (SomeKindOfErrorThatIsNotEmailError e1)
   {
      // send email
   }
   // ...
}
catch 
{
    // your email exception will get caught here
}
1 голос
/ 18 января 2012

вы можете попробовать исключение приложения, если это фатальная ошибка., хотя он устарел Checkthis теперь в .net framework.

Исключения из приложений

public sealed class Product
{
  private String name;
  public String Name
  {
    get { return name; }
    set
    {
      if (value != null) name = value;
      else throw new UndefinedNameException();
    }
  }
  public sealed class UndefinedNameException : ApplicationException
  {
    public UndefinedNameException() : base("Name cannot be null") {}
  }
} // end of class Product
1 голос
/ 18 января 2012

Конечно, вам придется окружить подпрограмму, в которой вы пытаетесь поймать, другим try catch, или написать свой код в операторе catch, окруженном оператором try catch.

1 голос
/ 18 января 2012

Один из подходов заключается в обработке исключения в операторе catch:

try
{
    // Do stuff
}
catch (SpecificException ex)
{
    try
    {
        // Try e-mailing
    }
    catch (AnotherException ex1)
    {
        // Write local log file
    }
 }

, что позволит программе продолжить работу.

Однако, еслиПрограмма не может обработать все необработанные исключения на уровне приложения и что-то там сделать.

1 голос
/ 18 января 2012

Если в предложении catch генерируется исключение, оно просто вызывает другое исключение. Один из способов решить эту проблему - просто сделать вложенную попытку, например.

try {
  <stuff>
} catch(Exception e) {
  try {
    <email admin>
  catch(EmailException e2) {
    <stuff>
  }
  <stuff>
}
0 голосов
/ 18 января 2012

Нет несовместимости с фактом использования последовательности try catch во фрагменте catch Логически, вы не поймаете одно и то же исключение, поэтому вы можете знать, какая часть не прошла

Лотиз парней дал вам код для использования, примите один из этих ответов

...