Re: [問題] ASP.NET with C# Error Handling
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):