C# 嵌套的Try/Catch块
我允许用户将数据从Excel文件上传到我的数据库,如果其中一个单元格的格式错误,我希望显示友好的错误消息。总共有20个左右的单元格需要上传,但现在我只尝试两个。我正在尝试的Excel上传在MedicalTotal字段中有一些随机文本,应该改为十进制格式。我验证了我的代码是否在正确的字段中。以下控制器代码不起任何作用。不向数据库写入任何内容,并重新加载相同的视图 在“监视”窗口中,我收到一条消息“Convert.ToDecimal(表[0])引发了System.FormatException类型的异常”。我已使用exception和FormatException尝试了该代码。我对捕获错误的其他方法持开放态度,请记住,我将重复try/catch过程大约20次C# 嵌套的Try/Catch块,c#,asp.net-mvc,C#,Asp.net Mvc,我允许用户将数据从Excel文件上传到我的数据库,如果其中一个单元格的格式错误,我希望显示友好的错误消息。总共有20个左右的单元格需要上传,但现在我只尝试两个。我正在尝试的Excel上传在MedicalTotal字段中有一些随机文本,应该改为十进制格式。我验证了我的代码是否在正确的字段中。以下控制器代码不起任何作用。不向数据库写入任何内容,并重新加载相同的视图 在“监视”窗口中,我收到一条消息“Convert.ToDecimal(表[0])引发了System.FormatException类型的
[Authorize]
[HttpPost]
public ActionResult CreateBenefitSummary(HttpPostedFileBase FileUpload, Guid ResponseId)
{
BenefitsUploadViewModel model = new BenefitsUploadViewModel();
if (FileUpload != null)
{
// tdata.ExecuteCommand("truncate table OtherCompanyAssets");
if (FileUpload.ContentType == "application/vnd.ms-excel" || FileUpload.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
string filename = FileUpload.FileName;
string targetpath = Server.MapPath("~/Doc/");
FileUpload.SaveAs(targetpath + filename);
string pathToExcelFile = targetpath + filename;
var connectionString = "";
if (filename.EndsWith(".xls"))
{
connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", pathToExcelFile);
}
else if (filename.EndsWith(".xlsx"))
{
connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", pathToExcelFile);
}
var excelFile = new ExcelQueryFactory(pathToExcelFile);
var table = (from a in excelFile.WorksheetRangeNoHeader("B2", "B32", "Benefits Template") select a[0]).ToList();
TempData["ResponseId"] = ResponseId;
try
{
Benefits b = new Benefits();
b.ResponseId = ResponseId;
try
{
b.MedicalTotal = Convert.ToDecimal(table[0]);
}
catch (FormatException)
{
model.ErrorList.Add("Medical Total cell must use Number, Currency, or Accounting format.");
}
b.StdSicknessAccident = Convert.ToDecimal(table[1]);
if (model.ErrorList.Count > 0) {
return View(model);
}
db.benefits.Add(b);
db.SaveChanges();
}
catch (SqlException ex)
{
ViewBag.Message = ex.Message;
}
catch (Exception ex)
{
ViewBag.Message = ex.Message;
}
//deleting excel file from folder
if ((System.IO.File.Exists(pathToExcelFile)))
{
System.IO.File.Delete(pathToExcelFile);
}
TempData["ResponseId"] = ResponseId;
return RedirectToAction("CreateBenefitSummary", "Surveys");
}
}
return View();
}您的convert.ToDecimal可能应该改为使用Decimal.TryParse,然后在if语句后显示错误消息,查看是否解析了结果。使用try/catch进行流量控制通常被认为是不好的做法 比如:
Decimal decVal;
if (Decimal.TryParse(table[0], out decVal))
{
b.MedicalTotal = decVal;
}
else
{
model.ErrorList.Add("Medical Total cell must use Number, Currency, or Accounting format.");
}
您的convert.ToDecimal可能应该改为使用Decimal.TryParse,然后在if语句后显示错误消息,查看是否解析了结果。使用try/catch进行流量控制通常被认为是不好的做法 比如:
Decimal decVal;
if (Decimal.TryParse(table[0], out decVal))
{
b.MedicalTotal = decVal;
}
else
{
model.ErrorList.Add("Medical Total cell must use Number, Currency, or Accounting format.");
}
您可能希望使用而不是convert。另外,我建议您反转if语句,这样可以防止嵌套if,这使代码更具可读性(提前失败)。因此,与使用
if(FileUpload!=null)
相反,您可以使用if(FileUpload==null){return View();}
而不是convertLaw,我建议您反转if语句,这样可以防止嵌套的if,从而使代码更具可读性(提前失败)。因此,您应该使用if(FileUpload==null){returnview();}
Perfect!感谢您,第二个参数缺少了out
,逻辑是向后的,因为if是成功的路径,但它设置了错误。如果使用C#7+,您现在可以避免预先声明decVal并内联out变量声明。完美的感谢您,第二个参数缺少了out
,逻辑是向后的,因为if是成功的路径,但它设置了错误。如果使用C#7+,您现在可以避免预先声明decVal并内联out变量声明。