.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;
        }
    }
    
已邀请:
检查同一行上的“ 6”语句之后是否没有文本(代码或分号)。最可能的原因是\“ throw \”实际上不是if语句的“ inside \”,因此它总是被执行。 检查您是否正在调试DEBUG构建-您可能会在调试器中报告RELEASE构建的奇数值,这可能会使它看起来像一个变量,而实际上却是false。 在某些情况下(尽管通常只使用诸如预编译的dll或损坏的pdb文件的引用之类的东西)也可以查看与调试不同的代码,给人的印象是您对源代码所做的更改被忽略了。 。执行“构建”>“清理”,检查磁盘上是否不再存在您正在运行的程序集,然后对其进行重建以确保它是最新的并与您的源代码同步。     
我刚刚尝试了类似的方法,对我来说效果很好。您是否使用语句块而不是单个抛出线尝试了此操作? 编译器可能会感到困惑,可能需要重新启动。这并非闻所未闻。 :/     
如果查看File.Exists方法的内部结构,则会发现它在许多情况下都将返回false,包括: path为null或空字符串 该文件不存在 操作系统认为该文件实际上是目录 尝试访问文件的帐户没有读取权限。 引发了一些其他内部NotSupportedException,SecurityException,IOException或UnauthorizedAccessException。 问题是所有这些潜在的错误都被掩盖了。我建议改用
FileInfo
类:
var fileInfo = new FileInfo( assmSpec );
if ( !fileInfo.Exists )
    throw new TaskException( ...
FileInfo上的构造函数将向您抛出少数异常之一,这可能会为您提供有关该问题的更多信息。     

要回复问题请先登录注册