WPF 글로벌 예외 처리 프로그램
This question already has an answer here: 이 문제는 이미 여기에 답이 있습니다.
Where is the best place to implement the global Try/Catch block. 글로벌 Try/Catch 블록을 위한 최적의 위치는 어디입니까?At least I have to implement a messagebox with: "Sorry for the inconvenience ..."적어도 나는 다음과 같은 메시지로 메시지 상자를 실현해야 한다. "당신에게 불편을 끼쳐서 죄송합니다..."
#1층
참조:https://stackoom.com/question/6B3y/WPF전역 예외 처리 프로그램
#2층
You can handle the
AppDomain.UnhandledException
이벤트 처리할 수 있습니다 AppDomain.UnhandledException
이벤트EDIT: actually,this event is probably more adequate:
Application.DispatcherUnhandledException
편집: 실제로 이 이벤트가 더 적합할 수 있습니다: Application.DispatcherUnhandledException
#3층
You can trap unhandled exceptions at different levels: 처리되지 않은 이상을 다른 단계에서 포착할 수 있습니다.
AppDomain.CurrentDomain.UnhandledException
From all threads in the AppDomain. AppDomain.CurrentDomain.UnhandledException
은 AppDomain.CurrentDomain.UnhandledException
모든 라인에서 온다.Dispatcher.UnhandledException
From a single specific UI dispatcher thread. Dispatcher.UnhandledException
개별 UI 스케줄러 스레드에서 가져옵니다.Application.Current.DispatcherUnhandledException
From the main UI dispatcher thread in your WPF application. Application.Current.DispatcherUnhandledException
WPF 응용 프로그램의 기본 UI 스케줄러 스레드에서 가져옵니다.TaskScheduler.UnobservedTaskException
from within each AppDomain that uses a task scheduler for asynchronous operations. 작업 스케줄러를 사용하여 비동기식으로 작업하는 AppDomain당 TaskScheduler.UnobservedTaskException
You should consider what level you need to trap unhandled exceptions at. 어떤 단계에서 처리되지 않은 이상을 포착해야 할지 고려해야 합니다.
Deciding between #2 and #3 depends upon whether you're using more than one WPF thread. #2와 #3 사이의 선택은 여러 WPF 스레드를 사용하느냐에 따라 달라집니다.This is quite an exotic situation and if you're unsure whether you are or not, then it's most likely that you're not. 이것은 매우 특수한 상황입니다. 만약 당신이 자신이 있는지 없는지 확실하지 않다면, 당신은 아닐 가능성이 높습니다.
# 4층
토마스의 답을 보충하기 위해
Application
류는 당신이 처리할 수 있는 DispatcherUnhandledException
사건도 가지고 있습니다.#5층
위의 게시물 이외에: 상기 직위를 제외하고:
Application.Current.DispatcherUnhandledException
will not catch exceptions that are thrown from another thread then the main thread. 다른 스레드 (그 다음은 메인 스레드) 에서 발생하는 이상을 포착하지 않습니다.You have to handle those exceptions on its actual Thread. 실제 라인에서 이 이상을 처리해야 합니다.But if you want to Handle them on your global exception handler you can pass it to the main thread: 단, 전역 이상 처리 프로그램에서 처리하려면 메인 라인에 전달할 수 있습니다.
System.Threading.Thread t = new System.Threading.Thread(() =>
{
try
{
...
//this exception will not be catched by
//Application.DispatcherUnhandledException
throw new Exception("huh..");
...
}
catch (Exception ex)
{
//But we can handle it in the throwing thread
//and pass it to the main thread wehre Application.
//DispatcherUnhandledException can handle it
System.Windows.Application.Current.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action((exc) =>
{
throw new Exception("Exception from another Thread", exc);
}), ex);
}
});
#6층
As mentioned above 아까 말씀드린 대로.
Application.Current.DispatcherUnhandledException will not catch exceptions that are thrown from another thread then the main thread. Application.Current.DispatcherUnhandledException은 다른 스레드(그 다음 주 스레드)에서 발생하는 이상을 포착하지 않습니다.
that actual depend on how the thread wascreated 실제 상황은 스레드의 생성 방식에 달려 있습니다
One case that is not handled by Application.Current.DispatcherUnhandledException is System.Windows.Forms.Timer for which Application.ThreadException can be used to handle these if you run Forms on other threads than the main thread you will need to set Application.ThreadException from each such thread Application.Current.DispatcherUnhandledException이 처리되지 않는 경우 중 하나는 System입니다.Windows.Forms.Timer, 주 스레드를 제외한 다른 스레드에서 Forms를 실행하면 Application을 사용할 수 있습니다.이러한 상황을 처리하려면 ThreadException이 필요합니다. 응용 프로그램을 설정해야 합니다.모든 스레드에서 ThreadException
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.