作者leicheong (睡魔)
看板Programming
标题Re: [问题] ASP.NET with C# Error Handling
时间Tue Nov 24 08:48:48 2009
※ 引述《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