.net条件无法正确评估
|
我有以下简单的代码块
var assmSpec = util.ASSEMBLYFOLDER + task.AssemblyName; // evals to valid fileSpec
if (!File.Exists(assmSpec))
throw new TaskException(string.Format(
\"Assembly [{0}] cannot be located.\", assmSpec));
由于assmSpec引用的程序集实际上确实存在(将File.Exists()
评估为true),所以我希望不会抛出该异常。但它是。代码进入throw语句。为了调试,我将代码修改为:
var assmSpec = util.ASSEMBLYFOLDER + task.AssemblyName; // evals to valid fileSpec
var asmExists = File.Exists(assmSpec);
if (!asmExists)
throw new TaskException(string.Format(
\"Assembly [{0}] cannot be located.\", assmSpec));
在这里,“ 3”等于true,并且代码仍然步入正题。
然后,我将代码修改为:
var assmSpec = util.ASSEMBLYFOLDER + task.AssemblyName; // evals to valid fileSpec
if (!File.Exists(assmSpec) && File.Exists(assmSpec))
throw new TaskException(string.Format(
\"Assembly [{0}] cannot be located.\", assmSpec));
再次,代码仍然很容易出错。显然这里有些错误。有没有人解释?我在这里做的事情显然很愚蠢吗?
首先,此代码在一种方法中也具有try-catch-最终构造,但是在所有方法之前(try之前)...
完整的方法是:
public void StartProcess(Task task)
{
log.Write(log.Level.Debug, string.Format(
\"TaskWorker.StartProcess {0} process\",
task.Name), task.Name);
WorkerMessageManager.MsgArrvdWorkerHndlr += MsgArrvdWorkerHndlr;
var tskName = task.Name;
var assmSpec = util.ASSEMBLYFOLDER + task.AssemblyName;
if (!File.Exists(assmSpec))
throw new TaskException(string.Format(
\"Assembly [{0}] cannot be located.\", assmSpec));
try
{
WorkerMessageManager.NotifyWorker(new ProgressTaskMessage(
tskName, \"\", tskName + \" starting...\"));
// -------------------------------------------
Assembly dA;
try { dA = Assembly.LoadFrom(assmSpec); }
catch(FileNotFoundException nfX)
{ throw new TaskException(string.Format(
\"Assembly [{0}] cannot be located.\", assmSpec),
nfX); }
// -------------------------------------------
var iTsk = (IExecuteTasks)dA.CreateInstance(task.ClassName);
if (iTsk == null)
throw new TaskException(
string.Format(\"Unable to instantiate {0} from {1}\",
task.ClassName, task.AssemblyName));
if (iTsk.TaskName != tskName) // do not execute if names do not match
throw new TaskNameMismatchException(string.Format(
\"CHECK CONFIGURATION SETTINGS, Data Task Name Mismatch.{0}\" +
\"Task name defined in TaskScheduler.config [{1}], {0} does \" +
\"not match name [{2}] as defined in Task Logic assembly: {3}.{4}\",
sNL, tskName, iTsk.TaskName, task.AssemblyName,
task.ClassName), tskName, iTsk.TaskName);
// -------------------------------------------
iTsk.DataImportProgressEvent += OnProgressReport;
iTsk.ProcessCompletedEvent += OnProcessCompleted;
iTsk.GeneralEvent += OnGeneralEvent;
// -----------------------------------
log.Write(log.Level.Debug, string.Format(
\"{0} process Started\", task.Name),
task.Name);
if (task.JobQueue.HasJobReady)
iTsk.StartTask(JobQueues.Instance.DeQueue(tskName));
else iTsk.StartTask();
log.Write(log.Level.Debug, string.Format(
\"{0} process Completed\", task.Name),
task.Name);
}
catch (TaskNameMismatchException inmX)
{ log.Write(log.Level.Warn, inmX.Message, tskName, inmX); }
catch (BpaTaskException mX)
{
var errMsg = string.Format(
\"Error in Data Import StartProcess(). \" + sNL +
\"Exception {0}: {1}, \" + sNL +
\"Stack Trace: {2}\",
mX, mX.Message, mX.StackTrace);
log.Write(log.Level.Error, errMsg,
task.Name, mX);
}
catch(Exception X)
{
var errMsg = string.Format(
\"Error in Data Import StartProcess(). \" + sNL +
\"Exception {0}: {1}, \" + sNL +
\"Stack Trace: {2}\",
X, X.Message, X.StackTrace);
log.Write(log.Level.Error, errMsg, task.Name, X);
// WorkerMessageManager.NotifyWorker(new ImportFailMessage(X));
// This throw instruction causes the Scheduler service to stop alltogether
// I\'m Removing the throw for now, because it seems inappropriate to
// kill the whole service..
throw;
}
finally
{
task.IsRunning = false;
WorkerMessageManager.MsgArrvdWorkerHndlr -= MsgArrvdWorkerHndlr;
}
}
没有找到相关结果
已邀请:
3 个回复
呸溉
拟蓬
席陋临拈
类:
FileInfo上的构造函数将向您抛出少数异常之一,这可能会为您提供有关该问题的更多信息。