我的Powershell脚本抛出一个异常,但是没有给我抛出异常的行号:
The process cannot access the file 'C:/path/to/foo.txt' because it is being used by another process.
+ CategoryInfo : NotSpecified: (:) [Set-Content], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand
+ PSComputerName : localhost
我认为这里的最佳实践是重构脚本,以使用try / catch块来精确缩小引发Set-Content
异常的位置-但在这种情况下,由于脚本的大小/范围脚本,我试图避免该选项。
相反,我希望有一些自上而下的解决方案-例如,能够以增加的冗长性调用脚本,这样Powershell会在堆栈跟踪中打印行号(非常确定Python默认情况下执行此操作。)
Powershell 3.0本身支持吗?
编辑:可接受的答案to this question涉及“尝试/捕获”方法,我提到的不是我的首选方法。再有,当引发异常而无需强制尝试/捕获时,是否可以通过某种方法使PowerShell报告行号?我是否必须将整个脚本包装在通用try / catch中?我是否必须使用一些--verbose
标志来调用脚本? Powershell 3.0是否支持类似的功能?
答案 0 :(得分:1)
Set-PsDebug将在脚本运行时在控制台上打印每个命令。
public class ParentLensRequest extends AbstractLensRequest implements [long list of classes] {
private Map<String, Interval> intervals = new LinkedHashMap<>();
public Set<Interval> getPeriods() {
if (CollectionUtils.isEmpty(this.intervals)) {
this.intervals = new LinkedHashMap<>();
}
return intervals.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toCollection(LinkedHashSet::new));
}
@Override
public void addInterval(Interval interval) {
Objects.requireNonNull(interval, "Interval is required");
this.intervals.put(interval.getName(), interval);
}
@Override
public void updateInterval(String name, LocalDate startDate, LocalDate endDate, Optional<String> nameWithDates,
Optional<String> longName) {
//more code
}
}
@Getter @Setter public class ChildLensRequest extends ParentLensRequest { private ContextObject context; }