抛出ThirdPartyException
(我不知道他们的代码是如何工作的)异常的函数:
private void RequestDocuments(/* arguments... */) {
while(true) {
var revision = lastRevision;
var fetchedDocuments = 0;
try {
foreach(var document in connection.QueryDocuments(revision)) {
if(fetchedDocuments > fetchQuota) return;
container.Add(document);
++fetchedDocuments;
Logger.Log.InfoFormat("added document (revision: {0}) into inner container", document.Revision);
}
Logger.Log.Info("Done importing documents into the inner container");
return;
}
catch(Exception ex) {
if(ex is ThirdPartyException) {
// handle this in a certain way!
continue;
}
}
}
}
在这样的工作线程中调用此函数:
private void ImportDocuments() {
while(!this.finishedEvent.WaitOne(0, false)) {
try {
var documents = new List<GohubDocument>();
RequestDocuments(remoteServerConnection, documents, lastRevision, 100);
}
catch(Exception ex) {
// here is where it really gets handled!!!?
}
}
}
异常仅在最外层(在ImportDocuments
方法内)try/catch
内处理。
为什么?
答案 0 :(得分:1)
如果这是一个公开IQueryable
的LINQ API,那么由于LINQ to SQL实现通常使用的延迟执行,您不会收到错误。
要防止它,您必须在第一种方法中调用.ToList()
,FirstOrDefault()
等。这确保了查询确实已针对您的数据源执行。
解决方案:
var documents = connection.QueryDocuments(revision).ToList();
foreach(var document in documents) {
if(fetchedDocuments > fetchQuota) return;
// [...]
}