嵌套Try/Catch替代方案:PowerShell注册表日期转换优化咨询
问题背景
我需要将注册表中的日期转换为[Datetime]类型以进行相关操作,但受Autodesk特性影响,日期格式并不固定。同时要求在无法匹配到Autodesk可能使用的格式时抛出异常。
初始实现(存在代码异味)
最初采用嵌套try/catch的方式实现,但代码结构冗余、可读性差:
try { $var1 = (Get-Date) - ([Datetime]::ParseExact(($key.installDate), 'yyyyMMdd', $null)) } catch { try { $var1 = (Get-Date) - ([Datetime]::ParseExact(($key.installDate), 'M/dd/yy', $null)) } catch { try { $var1 = (Get-Date) - ([Datetime]::ParseExact(($key.installDate), 'M/dd/yyyy', $null)) } catch { throw "Date ($($key.installDate)) doesn't match any supported format" } } }
优化后的实现
之后我改成了遍历格式列表的方式,代码结构有所改善,但想知道是否还有更优的方案:
:castDate foreach ($format in @('yyyyMMdd', 'M/dd/yyyy', 'M/dd/yy')) { try { $var1 = (Get-Date) - ([Datetime]::ParseExact(($key.installDate), $format, $null)) break :castDate } catch {} } if (-not $var1) { throw "Date ($($key.installDate)) doesn't match any supported format" }
内容的提问来源于stack exchange,提问作者Gordon
相关产品推荐
相关产品推荐

