Поймать плохое перечисление - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь использовать перечисление в конструкторе класса PowerShell, где на перечисление ссылается переменная в вызове. Эта переменная может быть заполнена чем-то, что не разрешается правильно, и, конечно, я хочу перехватить это. Учитывая этот код

Enum pxPathType {
  FileSystem_Folder = 0
  FileSystem_File   = 1
  Registry_Key      = 2
  Registry_Property = 3
}

class PxPath {
    # Constructor
    PxPath ([string]$path, [pxPathType]$pathType) {
    }
}

$pathType = 'FileSystem_Folders'
$testPath = [PxPath]::New("C:\", [pxPathType]::$pathType)

, я получу очень обобщенное c исключение метода. Можно ли как-то выдать мое собственное исключение, когда я не передаю допустимое перечисление? Или это «правильный» способ сделать это, чтобы заранее проверить перечисление чем-то вроде if ([enum]::IsDefined(([pxPathType]), $pathType)) {

Мне не очень нравится этот вариант, потому что могут быть области, где мне понадобится экземпляр класс PxPath, и так будет, много дублирования проверки. Я предпочел бы сделать класс самодостаточным и выбросить исключение. Я думаю. ;)

1 Ответ

1 голос
/ 06 марта 2020

Ошибка завершения оператора (перенос MethodException), полученная по умолчанию, немного неуклюжа, но содержит соответствующую информацию:

MethodException: Cannot convert argument "pathType", with value: "", for ".ctor" to type "pxPathType": 
"Cannot convert null to type "pxPathType" due to enumeration values that are not valid.
Specify one of the following enumeration values and try again.
The possible enumeration values are "FileSystem_Folder,FileSystem_File,Registry_Key,Registry_Property"."

Единственный способ предоставить пользовательское сообщение об ошибке без дублирования - вместо этого определите ваш конструктор с параметром [string] и выполните собственную проверку внутри него:

Enum pxPathType {
  FileSystem_Folder = 0
  FileSystem_File   = 1
  Registry_Key      = 2
  Registry_Property = 3
}

class PxPath {
  # Constructor
  # NOTE:  $pathType is now defined as [string]
  PxPath ([string]$path, [string]$pathType) {
    # Try to convert to the enum type, and provide a custom
    # error message if that fails.
    $pathTypeEnum = 
      try { [pxPathType] $pathType } 
      catch { Throw "Not a valid path type: $pathType" }
  }
}

$pathType = 'FileSystem_Folders'
$testPath = [PxPath]::New("C:\", 'NotValid')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...