2010-05-18 28 views
1

[請,如果你發現它不夠好編輯標題]如何檢測特定代碼行上出現的錯誤?

我有代碼觸發XSL變換:

objMemoryStream = new MemoryStream(); 

xslTransform = new XslCompiledTransform(); 
xpathXmlOrig = new XPathDocument("E:\\xslt error\\Simulation_of_error\\input.xml"); 

xslSettings = new XsltSettings(); 
xslSettings.EnableScript = true; 
xslTransform.Load(strXmlQueryTransformPath, xslSettings, new XmlUrlResolver()); 
xslTransform.Transform(xpathXmlOrig, null, objMemoryStream); 
objMemoryStream.Position = 0; 
StreamReader objStreamReader = new StreamReader(objMemoryStream); 

方法xslTransform.Load(strXmlQueryTransformPath, xslSettings, new XmlUrlResolver());是受害者,其失敗有時由於一些時間沒問題。

我想檢測此代碼行的失敗並再次執行,直到它成功執行!

我試圖用「嘗試捕捉和WHILE方法」:

bool flag = true; 
do 
{ 
    try 
    { 
     xslTransform.Load(strXmlQueryTransformPath, xslSettings, new XmlUrlResolver()); 
     flag = false; 
    } 
    catch 
    { 
     flag = true; 
    } 
} while (flag); 

但問題是,「是越來越記錄在日誌文件中的錯誤」,那好。整個代碼是在一個更多的嘗試聲明,我懷疑是寫入日誌。這是我不想要的......我不希望最終用戶知道此代碼行的失敗。

有沒有辦法完成它?

錯誤的出現完全是隨機的。第一次失敗時,我嘗試重新觸發代碼,這可能會導致成功轉換(在下次嘗試時)!這就是爲什麼我得出結論:Load()方法的回憶可以解決這個問題。

+2

您可以發佈您正在接收的確切例外嗎? 此外,你應該非常小心循環,直到成功,因爲你的程序將永遠不會退出這個循環。例如,如果該文件沒有找到,該怎麼辦?自行處理特定異常將是更好的途徑。 – 2010-05-18 17:15:39

+2

該循環是一個等待發生的災難。添加一個Thread.Sleep超時和最大嘗試次數。 – aepheus 2010-05-18 17:24:09

+0

此外,該try catch不會允許任何來自xslTransform.Load的錯誤傳播,因此您可能會吠叫錯誤的樹。無論如何,如果我們知道確切的錯誤,我們可能會多一點幫助。 – aepheus 2010-05-18 17:28:19

回答

1

您是否嘗試刪除內聯腳本並將擴展對象傳遞給轉換

我相信這很可能會解決問題。

否則,你應該趕上XsltException及其屬性LineNumberLinePosition給你在發生異常的代碼中的位置。

更新:提供了一個編寫傳遞給轉換的擴展函數(擴展對象的一部分)的簡單示例及其在XSLT轉換中的用法here

+0

其實,DLL文件創建時,codeline xslTransform.Load ()方法被使用。 在服務器上有許多其他代碼片斷正在運行,這可能會佔據這個進程的主導地位,所以執行該進程需要很長時間,另一方面dll文件被刪除(可能是因爲某些超時問題),這使得該函數(其執行不完整)彈出窗口錯誤,因爲它無法找到* .dll(也有一些* .tmp)文件。所以我的結論是重新使用xslCompliledTransfom.Load()將解決問題..但不幸的是。它也會在執行成功之前彈出錯誤: – 2010-05-19 05:32:57

+0

由於我在xslt代碼中使用C#腳本(如示例代碼中所示),這需要xslCompliteTransform來創建dll文件以執行xslCompiledTransform.Load()方法。 關於服務器性能的值得注意的事情是:它不會每次都觸發這個錯誤:!轉換的重新觸發確實很好地工作..! 這導致了混亂。 – 2010-05-19 05:38:41

+0

@ infant-programmer:所以,這意味着:刪除內聯腳本並使它們成爲普通的擴展函數,只要做到這一點,你就可以消除這個問題 – 2010-05-19 12:51:15

0

嘗試使用其中一個構造函數重載。它可以讓你跨越你的變化。

//public XslCompiledTransform(bool enableDebug); 
var xslTransform = new XslCompiledTransform(true); 
+0

亞我試過了..這裏發佈的問題是從調試中得出的結論.. – 2010-05-20 05:54:09