回答
将引发异常,但那只会结束该线程。异常不会在启动它的线程中重新引发。
的异常被抛出,但我猜你没有看到它,因为它是在另一个线程抛出。因此,UI线程(或者其他线程调用另一个线程)不能捕获异常,因为它看不到它。
如果您登录的例外,例如文件,我敢肯定,你会看到它。 :)
异常会在任何线程被看到。我认为根本没有异常 - 线程正常完成。 – 2011-01-23 13:20:59
我确定有异常发生,但不会抛出主线程 – Hiyasat 2011-01-23 13:25:03
你确定引发异常吗?如果一个线程发生异常并失败,整个应用程序将崩溃,您可以注意到使用AppDomain.CurrentDomain.UnhandledException事件(请注意,事件触发时,您无法阻止应用程序结束,但可以清理资源并保存关键数据 - 请参阅事件文档以获取更多信息)。
这就提出了一个顶级异常指示一个大问题任何线程:
但是,从您提到的线程引用accepted answer。
您应该尝试记录异常,和/或通知其他线程此线程已失败。
我想也许你应该看看使用BackgroundWorker类。您可以订阅RunWorkerCompleted事件,它有一个Error属性,该属性将包含您的异常。
我认为问题的心脏是要了解一个线程中发生的异常不会被传递到处理上的调用线程。
例如,假设你有一个反叛方法:
private static void RebelWithoutACause()
{
throw new NullReferenceException("Can't touch this!");
}
比方说,你创建一个新的线程,在程序调用此方法,并且是安全的程序员,你决定信封一个工作try/catch
块:
private static void Main(string[] args)
{
try
{
var thread = new Thread(RebelWithoutACause);
thread.Start();
thread.Join();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
但是,如果你在调试器中运行它,你会发现,你永远也没有机会了catch
块,而是该线程将被杀死,调试器会抱怨你有一个未处理的异常。
您需要选择如何处理异常,但需要在每个线程输入方法内部进行处理。典型的处理包括记录细节,通过UI通知用户,并尽可能优雅地关闭应用程序。
可能做这样的事情:
const int numThreads = 8;
Thread[] threads = new Thread[numThreads];
Exception[] threadsExceptions = new Exception[numThreads];
for (int i = 0; i < numThreads; i++) {
threadsExceptions[i] = null;
int closureVariableValue = i;
ThreadStart command =() =>
{
try
{
throw new ArgumentException("thread_" + closureVariableValue + "'s exception");
}catch(Exception any)
{
threadsExceptions[closureVariableValue] = any;
}
};
threads[i] = new Thread(command);
threads[i].Start();
}
for(int i = 0; i < numThreads; i++)
{
threads[i].Join();
if (threadsExceptions[i] != null)
{
throw threadsExceptions[i];
}
}
- 1. 跨线程异常抛出
- 2. C++异常抛出
- 3. 的std ::线程创建抛出异常
- 4. Titan中的多线程抛出异常
- 5. 线程中抛出错误(异常)
- 6. 在UI线程上抛出异常
- 7. junit在线程抛出异常
- 8. C++/C#异常抛出
- 9. 抛出异常的C#
- 10. 在C++中抛出异常异常
- 11. C++ Boost代码在线程间抛出异常的示例
- 12. 魔术异常抛出抛出异常
- 13. C#/ ASP - 异常抛出
- 14. 异常抛出锁c#2
- 15. C# - 抛出异常类
- 16. Objective-C异常未抛出
- 17. SqlConnection.Open抛出异常C#
- 18. 抛出异常Xamarin c#
- 19. C#委托抛出异常
- 20. 致命异常:java.lang.IllegalStateException:致命异常在Scheduler.Worker线程上抛出
- 21. C#从一个循环启动线程抛出IndexOutOfBoundsException异常
- 22. 异常,而线程抛出错误在scoket c + + windows
- 23. 中断主调用线程如果子线程抛出异常
- 24. 异常抛出异常
- 25. 抛出异常
- 26. 抛出异常
- 27. 抛出异常
- 28. 异常抛出
- 29. c#异常抛出一个线程被捕获在另一个线程
- 30. C#:你提出或抛出异常?
注意你应该永远* *重新抛出异常就像你在那里做。只要在catch块中做`throw;`就足够了...... – Joey 2011-01-23 13:09:28
我知道我会抛出自定义的异常,并从消息 – Hiyasat 2011-01-23 13:23:53
中继承“System.Exception”。你必须抛出一个* new *异常,并添加你想要添加的信息。作为InnerException传递* original *异常。只有在增加的信息具有较高的价值时才能做到这一点,因为它使故障排除更加困难。 – 2011-01-23 14:51:24