我确信我已经在框架中的各种异常消息中看到了这一点.我检查了MSDN库中的以下页面,但找不到有关消息内容的更多指导:
异常抛出
错误消息设计
Exception.Message属性
第一页中可以解释它的唯一部分是这个文本:
在不要求适当权限的情况下,不要在异常消息中公开安全敏感信息.
这是由Dictionary <TKey,TValue> .Add方法抛出的ArgumentException ,它让我想起了这个问题.它看起来像这样:
System.ArgumentException : An item with the same key has already been added.
Run Code Online (Sandbox Code Playgroud)
为什么看起来不像这样?
System.ArgumentException : An item with the same key(123) has already been added.
Run Code Online (Sandbox Code Playgroud)
假设123是TKey值,基本上任何具有TKey值的格式都是我在调试时追踪错误的有用之处.
是否有一个已知的原因,为什么不包括这个?
用消息中的密钥重新抛出参数异常会被认为是不好的做法吗?我曾考虑过创建自己的异常子类,但我认为这是一个使用内置异常类似乎更好的选择的情况.
我正在学习WPF和MVVM,我想我已经掌握了大部分内容以及它是如何工作的但是我遇到了一些关于使用我不理解的RelayCommand(或DelegateCommand)的事情.我认为这与代表的工作方式有关.
请注意,以下代码目前仅在测试解决方案中,因此没有实时代码.此外,我正在考虑这个不需要参数如close的命令,并了解它为什么工作.
因此,如果我采用Josh Smith创建的RelayCommand(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030),我可以设置如下命令:
RelayCommand updateTextContentCommand;
public ICommand UpdateTextContentCommand
{
get
{
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
param => this.UpdateTextContentCommand_Execute());
}
return updateTextContentCommand;
}
}
Run Code Online (Sandbox Code Playgroud)
使用此execute方法:
public void UpdateTextContentCommand_Execute()
{
this.TextContent = DateTime.Now.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我使用了一个简单的绑定到TextBlock来查看结果,命令绑定到一个按钮.这很好用.我没有得到的是使用lambda表达式来创建命令.该Action<object>预期参数,不是吗?那么为什么这段代码有效呢?
如果我将上面的代码更改为
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute());
}
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
*'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand(System.Action)'的最佳重载方法匹配有一些无效的参数
参数1:无法从'void'转换为'System.Action'*
并删除()后Execute给出此错误:
参数1:无法从'方法组'转换为'System.Action'
但是,如果我改变这样的代码:
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute);
}
public void UpdateTextContentCommand_Execute(object param)
{
this.TextContent …Run Code Online (Sandbox Code Playgroud) 我知道之前已经问过这类问题,但我找不到一个比较我想到的选项.所以我打算在这里发帖,如果有重复,请发帖链接.
这已经结束了一个相当长的帖子,如果你有时间请阅读它,因为问题在最后
编辑2:我已经接受了答案,因为我认为这将是目前最好的解决方案.但是我想我还想回答另外两个问题来回答关于连接数字的问题.它们可以在这里找到:结合两个整数来创建一个唯一的数字和C#中的Concatenate整数.如果我打算尝试对数字进行编码(如下所示,如51122222),我认为这会很有用.虽然在c#中使用像String.Format这样的东西对我的小应用程序来说足够快.
我目前正在尝试找到一种方法来设置使用相同数据库模式的分布式应用程序,并且可以与一个主数据库同步,其他所有数据库也同步.
我目前计划的程序将作为一个相当简单的程序来跟踪信息.第一个版本可能包含两个表:Items和ItemHistory.这是可能字段的示例:
项目
ItemID(PK)?
Name String
Content String
ItemHistory
ItemHistoryID(PK)?
ItemID(FK)?
EventName String
CreatedOn DateTime
我已经列出了字段名称和类型,这个问题是关于PK类型的用途,因此它们缺失.
第一个版本将是一个标准的桌面应用程序,我目前正在计划使用带有WPF前端的C#和用于数据库的SQLite.最后我还想创建一个在我的Android手机上运行的版本.这是分布式部件的用武之地.我并不总是有信号,因此需要应用程序脱机运行并允许再次联机时同步.
以下是我到目前为止关于如何处理ID的想法:
虽然选项1可行,我过去曾使用它,但我想看看其他选项可能避免UUID问题.我希望有一个解决方案,在调试时更容易阅读并且可以排序.
选项2可行,但它确实限制了记录数量.我知道在我的小应用程序中它几乎不会超过那么多,但我想尝试看看是否有一个解决方案不需要这样的限制.选项3通过使用交替数字来避免限制,但我认为您需要知道要使用多少数据库,否则您可能会填写所有数字.在DB1上使用1的开头和1的增量,在DB2上使用2的开头和2的增量将使用每个数字.您可以使用50作为增量,但之后您只有另一个限制,但现在它可以使用它的应用程序数量.我再次知道它的限制在我的情况下不会受到影响,但在一个突然变得非常受欢迎的应用程序中可能是一个问题.
选项4似乎可以为我解决问题,但我不确定它是否会在实践中起作用.我的一个想法是允许在每个应用程序上设置前缀,然后可以使用自动递增值.例如PC1,PC2用于PC上的记录,也可能是PHONE1,PHONE2等来自Android的记录.这可以工作但是在字符串中使用数字会导致1,1,1,100的排序问题显示在彼此旁边,即使用较少的前导零,然后再次返回到有限数量的记录.
我想知道是否可以使用数字作为DB ID和自动增量.例如,PC = 1,PHONE = 2.那么我们的PC有11,12,13等,第11条记录可能有111条,PHONE则有304条记录为2304条.但我不知道如何做到这一点,或者是否可以轻松完成并且不会导致产生值的额外开销.
在工作中他们使用了类似的编号系统,他们使用类似于51122222的东西.5将引用应用程序的实例,然后是2位数年份,最后是自动递增数字.我还没有得到一个明确的答案,如果我们在一年内超过99999条记录会发生什么.我认为他们可能已经认为它不会发生并且很高兴他们已经计算了风险.
最后一个问题,有没有办法为分布式应用程序创建一个主键系统,允许排序而不强制限制(除了数据类型本身的大小,例如最大整数)?
编辑:这是我打算写的应用程序的更多信息.我想创建一些东西,让我可以存储我可能获得的任何类型的信息,系统将包括标记条目的能力,以便我可以搜索主题.到目前为止,我看到的信息类型可能是关于书籍,DVD,网站等的建议.或者也许是我居住地方的当地提示.一个总体思路是停止将这些信息分散在不同格式的多台计算机/笔记本电脑/手机上.
我已经完成了最后一部分的所有步骤(启动另一个活动)并且它确实在第二个活动上显示消息但是当我单击向上按钮时它会抛出下面的异常,我已经包含了LogCat中的整个错误部分窗口.
我尝试在线搜索" bad parentActivityName "或" 没有指定父活动名称 "但我找不到任何明确的信息或与培训相关的任何内容.
E/Activity(17099): getParentActivityIntent: bad parentActivityName 'com.example.myfirstapp.MainActivity' in manifest
E/NavUtils(17099): getParentActivityIntent: bad parentActivityName 'com.example.myfirstapp.MainActivity' in manifest
D/AndroidRuntime(17099): Shutting down VM
E/AndroidRuntime(17099): FATAL EXCEPTION: main
E/AndroidRuntime(17099): java.lang.IllegalArgumentException: Activity DisplayMessageActivity
does not have a parent activity name specified. (Did you forget to add the
android.support.PARENT_ACTIVITY <meta-data> element in your manifest?)
E/AndroidRuntime(17099): at android.support.v4.app.NavUtils.navigateUpFromSameTask(NavUtils.java:177)
E/AndroidRuntime(17099): at com.example.myfirstname.DisplayMessageActivity.onOptionsItemSelected(DisplayMessageActivity.java:55)
E/AndroidRuntime(17099): at android.app.Activity.onMenuItemSelected(Activity.java:2548)
E/AndroidRuntime(17099): at com.android.internal.widget.ActionBarView$3.onClick(ActionBarView.java:167)
E/AndroidRuntime(17099): at android.view.View.performClick(View.java:4204)
E/AndroidRuntime(17099): at android.view.View$PerformClick.run(View.java:17355)
E/AndroidRuntime(17099): at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime(17099): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(17099): …Run Code Online (Sandbox Code Playgroud)