Re: [問題] ASP.NET with C# Error Handling

看板Programming作者 (睡魔)時間16年前 (2009/11/24 08:48), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
※ 引述《cyril63 (...)》之銘言: : 程式功能 : (如以下程式片段) : 經由 url 給定 filename及 datestring , : 程式呼叫Excel COM讀取該檔案然後另存新檔 : 再download 此 File 到 client 端 : 問題描述 : : 正常情況下程式都可正常運作 : 但有時候會有 COM Error 的情況發生 (發生問題不明) : 當有 Error 發生時 程式就會轉到Catch那一段輸出 Error Message : 現在的問題是如何在 Error Processing (即 Catch 裡)加上關掉 COM Object的程式 : 亦即用綠色標起來那一段 : 如果直接加那一段沒改變的話 : 會產生找不到變數的錯誤 : 請問該如何處理呢 : [Defauls.aspx.cs] : using Microsoft.Office.Interop.Excel; : using System; : using System.Collections.Generic; : using System.Web; : using System.Web.UI; : using System.Web.UI.WebControls; : namespace WebApplication1 : { : public partial class _Default : System.Web.UI.Page : { : protected void Page_Load(object sender, EventArgs e) : { : try : { : string InputFile = Request.QueryString["file_name"]; : string DateStr = "_"+Request.QueryString["date_str"]; : string ProcessMode = Request.QueryString["mode"]; : string OutputFile = InputFile.Replace(DateStr, ""); : string FilePath = "F:\\excel_process\\"+InputFile; : if (!System.IO.File.Exists(FilePath)) : { : Response.Write("<script language=\"javascript\">\n"); : Response.Write("alert(\"Internal Error!!\");\n"); : Response.Write("</script>\n"); : return; : } : Microsoft.Office.Interop.Excel.Application xlApp = : new Microsoft.Office.Interop.Excel.ApplicationClass(); 這裡先加上 xlApp.Interactive = false; 否則在有詢問的popup時會卡掉, 然後之後的COM+操作都會沒有回應 而出Exception... : Microsoft.Office.Interop.Excel.Workbook xlBook = : xlApp.Workbooks.Open(FilePath); : Microsoft.Office.Interop.Excel.Worksheet xlSheet = : (Microsoft.Office.Interop.Excel.Worksheet)xlBook.Worksheets.Item[1]; : string SaveFilePath = "F:\\excel_process\\" +OutputFile; : xlBook.SaveAs(SaveFilePath); : //close all object Start : System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet); : xlSheet = null; : xlBook.Close(false, Type.Missing, Type.Missing); : xlApp.Workbooks.Close(); : System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook); : xlBook = null; 相對的, 這裡要補回 xlApp.Interactive = true; : System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp.Workbooks); : xlApp.Quit(); : System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); : xlApp = null; : GC.Collect(); : GC.WaitForPendingFinalizers(); : //close all object end : : if ((ProcessMode == "")||(ProcessMode == null)) : { : Response.AppendHeader("Content-Type", "application/X-MS-Excel;"); : Response.AppendHeader("Content-Disposition", : "attachment; filename=" + OutputFile); : Response.WriteFile(SaveFilePath); : } : } : catch (Exception error_msg) : { : Response.Write("<BR>[Error]<BR>" + error_msg.ToString()); : } : } : } : } 不過正如微軟自己說的, Office Automation事實上不建議在無人看管 的環境下使用. 尤其是Office 2003或以前的版本, 關閉了互動屬性後 仍在會某些地方出現popup, 卡死的COM server又不會自己清掉 (會看到一堆Excel.exe在執行), 強行kill掉又可能會有file lost (卡在save dialog的場合) 可以控制requirement的話最好能讓他們存成XML檔, 再用.NET本身的 XML parser處理是最合適的. -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.218.54.225
文章代碼(AID): #1B2oroVh (Programming)
文章代碼(AID): #1B2oroVh (Programming)