之前有关于重新抛出异常的正确方法的讨论.相反,这个问题是关于如何在使用rethrow时从Visual Studio获得有用的行为.
考虑以下代码:
static void foo() {
throw new Exception("boo!");
}
static void Main(string[] args) {
try {
foo();
} catch (Exception x) {
// do some stuff
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
出现的异常具有正确的堆栈跟踪,显示foo()作为异常的来源.但是,GUI调用堆栈窗口只显示Main,而我期望它显示异常的调用堆栈,一直到foo.
当没有重新抛出时,我可以使用GUI快速导航调用堆栈,以查看导致异常的调用以及我们如何到达那里.
通过重新抛出,我希望能够做同样的事情.相反,GUI显示的调用堆栈对我没用.我必须将异常详细信息复制到剪贴板,将其粘贴到记事本,然后手动导航到我感兴趣的调用堆栈的任何功能.
顺便说一句,如果我添加[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
或者如果我将catch更改为just ,我会得到相同的行为catch (Exception)
.
我的问题是:鉴于我使用的代码重新抛出,有人可以建议一种方便的方法来导航与异常相关的调用堆栈吗?我正在使用Visual Studio 2010.
这个让我困惑.当我甚至没有打电话时,我收到关于寻找的错误?
我的代码看起来像这样:
// send 42
uint value = 42;
byte[] msg = BitConverter.GetBytes(value);
stream.Write(msg, 0, sizeof(uint));
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
System.NotSupportedException was unhandled
Message="This stream does not support seek operations."
Source="System"
StackTrace:
at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin)
at System.IO.BufferedStream.FlushRead()
at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count)
...
Run Code Online (Sandbox Code Playgroud)
流是类型System.IO.BufferedStream
.可能会发生什么?
编辑更多信息:
sizeof(uint)==msg.length
在这种情况下.
流声明为stream = new BufferedStream(new NetworkStream(socket), 1024)
编辑:
就是这样!虽然可以在一个单独读取和写入NetworkStream
,但当切换到BufferedStream
它时,必须有一个单独的读取和写入.显然,只需NetworkStream
在同一个套接字上调用构造函数两次即可.
如果可以的话,我会接受Justin和Hans的答案,因为我让我完全理解错误,另一个让我找到解决方案.感谢大家!
可以使用CRITICAL_SECTION变量来实现互斥.
我的问题是:CRITICAL_SECTION是否支持复制?如果我将一个值传递给另一个线程,我是否可以确定相互排除是否有效?
如果答案是"你不能那样做",我不会感到惊讶,但是得到某种官方确认会很好.我无法在文档中找到任何声明.
我正在使用C#内置的Winforms Chart控件(System.Windows.Forms.DataVisualization.Charting.Chart),它具有内置功能,允许用户选择一个范围.我想做的是回读用户选择的范围.当然必须有一些简单的方法来做到这一点,但我一直无法找到它.
光标启用如下:
var ca = chart1.ChartAreas["ChartArea1"].CursorX;
ca.CursorX.IsUserEnabled = true;
ca.CursorX.IsUserSelectionEnabled = true;
Run Code Online (Sandbox Code Playgroud)
我知道当用户通过启用选择范围时我可以使图表变焦ca.AxisX.ScaleView.Zoomable
,但我不希望图片改变:相反,我使用图表作为显示信息的方式,让用户选择一个范围然后我做了一些额外处理的X值.
我尝试连接到chart1.SelectionRangeChanged,并且每次更改范围时确实会触发 - 我似乎无法从CursorEventArg中获取选择范围.它有" NewSelectionStart
"和" NewSelectionEnd
"字段,但这些都是NaN
令人失望的.我试着查看图表和轴的各种属性,但没有找到任何听起来很有希望的东西.
进一步的调查揭示了ChartArea.CursorX.SelectionStart属性,这听起来正是我需要的......除了它也是NaN.我不知道这是正常还是我遇到某种错误?
那么,我该如何确定用户选择的范围?
C#和Python都允许使用命名参数,因此您可以编写如下内容:foo(bar:1)
.这很好,特别是与可选参数结合使用时.
我的问题是:如果有的话,C#和Python命名参数之间有什么区别?我对哪个是"最好的"不感兴趣,但是对于这些差异背后是否存在差异和可能的动机.
如果有人知道与其他语言的这个功能的实现(可能是Ruby或Objective-C)的差异,那也可能很有趣.
编辑以制作社区维基
以下过滤器在我的prj2
.从那里prj2
我正在检查会话是否不在那里我想重定向到prj1
具有url 的登录页面/prj1/sessionexpiry
.在以下场景中,它不会重定向到登录页面而不会抛出任何异常.
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse hsr = (HttpServletResponse) res;
HttpServletRequest hreq = (HttpServletRequest) req;
HttpSession session = hreq.getSession(false);
if (session == null) {
hsr.sendRedirect("/prj1/sessionexpiry");
return;
} else {
chain.doFilter(req, res);
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
Dataflow SDK中是否有允许我在工作器上暂存资源文件的内容?我有特定的静态文件资源,我需要在文件系统上为执行NLP的自定义DoFn提供这些资源.我的目标是从类加载器获取zip文件资源,并在工作程序初始化时将其解压缩到工作文件系统上,而不是尝试在自定义DoFn中执行此操作.
我正在尝试使用预处理器技巧来声明一个魔术变量.像这样的东西:
DECLARE(x)
Run Code Online (Sandbox Code Playgroud)
应该扩展到
int _DECLARED_VARIABLE_x_LINE_12
Run Code Online (Sandbox Code Playgroud)
如果声明在输入源的第12行.我试图使用## token-pasting命令和__LINE__
宏,但我要么__LINE__
在那里得到一个未解释的" ",否则预处理器似乎完全忽略了我的行.我目前的猜测是:
#define DECLARE(x) _DECLARED_VARIABLE_ ## x ## _LINE_ ## __LINE__
Run Code Online (Sandbox Code Playgroud) 代码如下所示:
return pcol.apply(ParDo.named("FindTheBug")
.withSideInputs(foo)
.withSideInputs(bar(
.of(new DoFn<T, U>() {
F myFoo = c.sideInput(foo);
B myBar = c.sideInput(bar);
Run Code Online (Sandbox Code Playgroud)
声明这些侧输入,为什么Dataflow没有看到它们?