Снимите флажок «Плюрализовать или сгенерировать имена генерируемых объектов» при создании объекта сущности.
Я только что поиграл с поведением UnhandledException AppDomain, (это последний этап, на котором регистрируется необработанное исключение)
Да, после обработки обработчиков событий ваше приложение будет остановлено и появится неприятный диалог «... программа перестала работать».
:) Вы по-прежнему можете этого избежать.
Отметьте:
class Program
{
void Run()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Console.WriteLine("Press enter to exit.");
do
{
(new Thread(delegate()
{
throw new ArgumentException("ha-ha");
})).Start();
} while (Console.ReadLine().Trim().ToLowerInvariant() == "x");
Console.WriteLine("last good-bye");
}
int r = 0;
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Interlocked.Increment(ref r);
Console.WriteLine("handled. {0}", r);
Console.WriteLine("Terminating " + e.IsTerminating.ToString());
Thread.CurrentThread.IsBackground = true;
Thread.CurrentThread.Name = "Dead thread";
while (true)
Thread.Sleep(TimeSpan.FromHours(1));
//Process.GetCurrentProcess().Kill();
}
static void Main(string[] args)
{
Console.WriteLine("...");
(new Program()).Run();
}
}
PS Обрабатывайте необработанные исключения для Application.ThreadException (WinForms) или DispatcherUnhandledException (WPF) на более высоком уровне.
Я использую следующий подход, который работает и значительно сокращает объем кода (но я не уверен, есть ли лучший способ и каковы его подводные камни. быть. Когда бы вы ни звонили: Я думаю, что вопросы с указанием минусов были бы достаточно вежливыми, чтобы прояснить их действия; )
try
{
CallTheCodeThatMightThrowException()
}
catch (Exception ex)
{
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace ();
Utils.ErrorHandler.Trap ( ref objUser, st, ex );
} //eof catch
А вот код ErrorHandler: Чтобы прояснить: objUser - это объект, моделирующий пользователей приложений (вы можете получить такую информацию, как имя домена, отдел, регион и т. Д., Для целей ведения журнала. Регистратор ILog - это объект регистрации - например, тот, который выполняет действия регистрации. StackTrace st - объект StackTrace, предоставляющий отладочную информацию для вашего приложения.
using System;
using log4net; //or another logging platform
namespace GenApp.Utils
{
public class ErrorHandler
{
public static void Trap ( Bo.User objUser, ILog logger, System.Diagnostics.StackTrace st, Exception ex )
{
if (ex is NullReferenceException)
{
//do stuff for this ex type
} //eof if
if (ex is System.InvalidOperationException)
{
//do stuff for this ex type
} //eof if
if (ex is System.IndexOutOfRangeException)
{
//do stuff for this ex type
} //eof if
if (ex is System.Data.SqlClient.SqlException)
{
//do stuff for this ex type
} //eof if
if (ex is System.FormatException)
{
//do stuff for this ex type
} //eof if
if (ex is Exception)
{
//do stuff for this ex type
} //eof catch
} //eof method
}//eof class
} //eof namesp
В управляемом приложении с графическим интерфейсом пользователя по умолчанию исключения, возникающие в потоке графического интерфейса пользователя, обрабатываются тем, что назначено для Application.ThreadException.
Обработка исключений, возникающих в других потоках. by AppDomain.CurrentDomain.UnhandledException.
Если вы хотите, чтобы исключения потока вашего графического интерфейса работали так же, как исключения из вашего графического интерфейса, так что они обрабатывались AppDomain.CurrentDomain.UnhandledException, вы можете сделать следующее:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Преимущество для перехват исключений потока GUI с помощью ThreadException заключается в том, что вы можете дать пользователю возможность разрешить продолжение работы приложения. Чтобы убедиться, что никакие файлы конфигурации не переопределяют поведение по умолчанию, вы можете вызвать:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Вы по-прежнему уязвимы для исключений из плохо работающих собственных dll. Если собственная dll устанавливает собственный обработчик с помощью Win32 SetUnhandledExceptionFilter, предполагается сохранить указатель на предыдущий фильтр и вызвать его тоже. Если этого не произойдет, ваш обработчик не будет вызван.