<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>简单生活 -- Kevin Yang的博客 &#187; 异常</title>
	<atom:link href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8/feed" rel="self" type="application/rss+xml" />
	<link>http://www.imkevinyang.com</link>
	<description>It&#039;s all about sharing</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:37:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>解决维度成员中的非法Xml字符导致的查询错误</title>
		<link>http://www.imkevinyang.com/2009/09/%e8%a7%a3%e5%86%b3%e7%bb%b4%e5%ba%a6%e6%88%90%e5%91%98%e4%b8%ad%e7%9a%84%e9%9d%9e%e6%b3%95xml%e5%ad%97%e7%ac%a6%e5%af%bc%e8%87%b4%e7%9a%84%e6%9f%a5%e8%af%a2%e9%94%99%e8%af%af-2.html</link>
		<comments>http://www.imkevinyang.com/2009/09/%e8%a7%a3%e5%86%b3%e7%bb%b4%e5%ba%a6%e6%88%90%e5%91%98%e4%b8%ad%e7%9a%84%e9%9d%9e%e6%b3%95xml%e5%ad%97%e7%ac%a6%e5%af%bc%e8%87%b4%e7%9a%84%e6%9f%a5%e8%af%a2%e9%94%99%e8%af%af-2.html#comments</comments>
		<pubDate>Sat, 19 Sep 2009 15:29:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[BI/数据库]]></category>
		<category><![CDATA[Analysis Services]]></category>
		<category><![CDATA[Mdx]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[维度]]></category>
		<category><![CDATA[非法Xml字符]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/10/%e8%a7%a3%e5%86%b3%e7%bb%b4%e5%ba%a6%e6%88%90%e5%91%98%e4%b8%ad%e7%9a%84%e9%9d%9e%e6%b3%95xml%e5%ad%97%e7%ac%a6%e5%af%bc%e8%87%b4%e7%9a%84%e6%9f%a5%e8%af%a2%e9%94%99%e8%af%af-2.html</guid>
		<description><![CDATA[<p><font color="#ff0000">update(2009-09-20): 增加了去除这些非法Xml字符的正则表达式以及C#代码。</font></p>
问题描述
<p>最近在项目中遇到这么个情况，在展开维度成员的时候，服务端抛出了“The server sent an unrecognizable response”的异常，看了下异常细节，给出的信息是“'', hexadeci&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><font color="#ff0000">update(2009-09-20): 增加了去除这些非法Xml字符的正则表达式以及C#代码。</font></p>
<h2>问题描述</h2>
<p>最近在项目中遇到这么个情况，在展开维度成员的时候，服务端抛出了“The server sent an unrecognizable response”的异常，看了下异常细节，给出的信息是“'', hexadecimal value 0x01, is an invalid character. Line 1, position 6771. (System.Xml) ”。</p>
<h2>问题解决</h2>
<p>出现这样问题的原因在于，微软的Analysis Service使用XMLA（XML for Analysis）语言和其他客户端进行交互，包括执行Mdx、DMX、Sql等。<strong><font color="#008000">如果服务端返回的成员（关键列、名字、标题、成员值等）含有一些非打印字符的话，那么就无法直接在Xml中表示，这样就会导致客户端无法解析返回的Xml响应，而出现上述的错误</font></strong>。</p>
<p>Analysis Service在Process的时候，出于性能考虑默认情况下是不会对数据进行这种Xml非法字符的检测。不过Analysis Service也提供了一个设置开关，允许我们在处理阶段检测这些非法字符，并做一定的规范化处理。在BIDS中，我们打开维度属性的属性面板，有一个InvalidXmlCharacters的设置，如下图所示：</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="InvalidXmlCharacters设置" border="0" alt="InvalidXmlCharacters设置" src="http://www.imkevinyang.com/wp-content/uploads/2009/10/image_thumb.png" width="218" height="168" /> </p>
<p><strong><font color="#008000">默认情况下其值为Preserve，也就是保留这些非法字符。它还有其他两个选项。Remove表示移除这些非法字符，只保留合法的Xml字符。Replace表示使用问号?替换非法字符，一个非法字符对应一个问号</font></strong>。在实际应用中，InvalidXmlCharacters需要根据项目的实际情况进行设置。如果对数据的这种清理可以放到ETL阶段，那么最好放到ETL阶段，因为这样可以加快Analysis Service处理的速度。否则就只能在Process的时候做检测了。对于Remove和Replace，我比较倾向于选择Remove。因为既然已经是非打印字符了，用问号代替固然能够和其他数据区分开来，但是对于最终用户来说，大部分情况下只会增加他们的迷惑而已。</p>
<h2>剔除非法Xml字符</h2>
<p>在<a title="Xml 1.0规范" href="http://www.w3.org/TR/REC-xml/#NT-Char" target="_blank">Xml 1.0规范</a>（第五版，06/11/2008）的2.2一节中提到了Xml合法字符的范围：</p>
<blockquote><p><i>/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */</i></p>
<p><code>Char</code> ::=&#160;&#160; <code>#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]</code>       </p>
</blockquote>
<p>规范中建议，所有Xml处理器都应该正确处理上述范围的这些字符。</p>
<p>我们可以在处理字符串的时候使用正则表达式剔除掉非法的Xml字符，以保证最终进入Analysis Service的字符都是Xml合法字符。</p>
<pre class="csharpcode">[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]</pre>
<p>对应的C#代码如下，出于性能考虑，可以将函数内部的正则表达式存储为成员变量，并设置为预编译模式。</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> String StripInvalidXmlChars(String input)
{
  Regex re = <span class="kwrd">new</span> Regex(<span class="str">@&quot;[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]&quot;</span>);
  <span class="kwrd">return</span> re.Replace(input, <span class="str">&quot;&quot;</span>);
}</pre>
<p>&#160;</p>
<p>参考文档：</p>
<p><a href="http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html" rel="nofollow">Invalid XML Characters: when valid UTF8 does not mean valid XML</a></p>
<p><a title="unprintable characters in member names cause error" href="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=264939" rel="nofollow" target="_blank">unprintable characters in member names cause error</a></p>
<p><a title="Xml 1.0规范" href="http://www.w3.org/TR/REC-xml/#NT-Char" target="_blank">Xml 1.0规范</a></p>
<p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/tags/analysis-services" title="Analysis Services" rel="tag">Analysis Services</a>, <a href="http://www.imkevinyang.com/categories/techarticles/businessintelligence" title="BI/数据库" rel="tag">BI/数据库</a>, <a href="http://www.imkevinyang.com/tags/mdx" title="Mdx" rel="tag">Mdx</a>, <a href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8" title="异常" rel="tag">异常</a>, <a href="http://www.imkevinyang.com/tags/%e7%bb%b4%e5%ba%a6" title="维度" rel="tag">维度</a>, <a href="http://www.imkevinyang.com/tags/%e9%9d%9e%e6%b3%95xml%e5%ad%97%e7%ac%a6" title="非法Xml字符" rel="tag">非法Xml字符</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2010/05/64%e4%bd%8d%e7%b3%bb%e7%bb%9f%e4%b8%8biis7-isapi%e5%a4%84%e7%90%86%e5%99%a8%e5%8a%a0%e8%bd%bd%e5%a4%b1%e8%b4%a5.html" title="64位系统下IIS7 ISAPI处理器加载失败 (2010/05/05)">64位系统下IIS7 ISAPI处理器加载失败</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/analysis-services-2005-olap%e8%ae%be%e8%ae%a1%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5.html" title="Analysis Services 2005 OLAP设计最佳实践 (2009/04/02)">Analysis Services 2005 OLAP设计最佳实践</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/04/analysis-services%ef%bc%9a%e4%bd%a0%e5%ba%94%e8%af%a5%e4%bd%bf%e7%94%a8%e5%a4%9a%e5%af%b9%e5%a4%9a%e7%bb%b4%e5%ba%a6%e5%90%97%ef%bc%9f.html" title="Analysis Services：你应该使用多对多维度吗？ (2010/04/12)">Analysis Services：你应该使用多对多维度吗？</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/bids%e5%af%b9%e4%ba%8e%e7%bb%b4%e5%ba%a6%e5%b1%9e%e6%80%a7%e9%94%ae%e4%b8%ba%e5%8f%af%e5%8f%98%e9%95%bf%e5%88%97%e6%97%b6%e5%ad%98%e5%9c%a8%e7%9a%84bug.html" title="BIDS对于维度属性键为可变长列时存在的Bug (2009/03/22)">BIDS对于维度属性键为可变长列时存在的Bug</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/bids%e9%83%a8%e7%bd%b2%e6%97%b6%e5%87%ba%e7%8e%b0%e5%85%83%e6%95%b0%e6%8d%ae%e7%ae%a1%e7%90%86%e5%99%a8%e5%8f%91%e7%94%9f%e9%94%99%e8%af%af.html" title="BIDS部署时出现元数据管理器发生错误 (2009/03/13)">BIDS部署时出现元数据管理器发生错误</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/01/google-analytics%e4%b8%ad%e7%9a%84page%e7%bb%b4%e5%ba%a6.html" title="Google Analytics中的Page维度 (2010/01/04)">Google Analytics中的Page维度</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html" title="Javascript中获取出错代码所在文件及行数 (2009/05/18)">Javascript中获取出错代码所在文件及行数</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/08/olap%e4%b8%ad%e7%9a%84averageofchildren%e8%81%9a%e5%90%88%e6%96%b9%e5%bc%8f.html" title="OLAP中的AverageOfChildren聚合方式 (2009/08/10)">OLAP中的AverageOfChildren聚合方式</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/07/ssas%e5%a4%84%e7%90%86%e6%97%b6%e6%89%be%e4%b8%8d%e5%88%b0%e5%b1%9e%e6%80%a7%e9%94%ae%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95.html" title="SSAS处理时&ldquo;找不到属性键&rdquo;的解决办法 (2010/07/19)">SSAS处理时&ldquo;找不到属性键&rdquo;的解决办法</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html" title="Visual Studio小贴士&mdash;&mdash;加了Try-Catch也能自动定位到异常代码 (2009/09/18)">Visual Studio小贴士&mdash;&mdash;加了Try-Catch也能自动定位到异常代码</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/09/%e8%a7%a3%e5%86%b3%e7%bb%b4%e5%ba%a6%e6%88%90%e5%91%98%e4%b8%ad%e7%9a%84%e9%9d%9e%e6%b3%95xml%e5%ad%97%e7%ac%a6%e5%af%bc%e8%87%b4%e7%9a%84%e6%9f%a5%e8%af%a2%e9%94%99%e8%af%af-2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio小贴士&#8212;&#8212;加了Try-Catch也能自动定位到异常代码</title>
		<link>http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html</link>
		<comments>http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html#comments</comments>
		<pubDate>Fri, 18 Sep 2009 05:07:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[工具技巧]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[小贴士]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[断点]]></category>
		<category><![CDATA[调试]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html</guid>
		<description><![CDATA[<p>Visual Studio的调试功能非常强大。当异常发生的时候，能够自动定位到异常发生的地方。但是如果你在代码外层显式的加上了Try-Catch异常捕获的时候，默认情况下，Visual Studio会直接跳到异常处理代码块，而不是出现异常的代码行。</p>
<pre class="csharpcode"><span class="kwrd">namespace</span> BreakOnException
{
    <span class="kwrd">cl&#8230;</span></pre>]]></description>
			<content:encoded><![CDATA[<p>Visual Studio的调试功能非常强大。当异常发生的时候，能够自动定位到异常发生的地方。但是如果你在代码外层显式的加上了Try-Catch异常捕获的时候，默认情况下，Visual Studio会直接跳到异常处理代码块，而不是出现异常的代码行。</p>
<pre class="csharpcode"><span class="kwrd">namespace</span> BreakOnException
{
    <span class="kwrd">class</span> Program
    {
        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)
        {
            <span class="kwrd">try</span>
            {
                Program p = <span class="kwrd">null</span>;
                Console.WriteLine(p.GetHashCode());
            }
            <span class="kwrd">catch</span> (System.Exception ex)
            {

            }
        }
    }
}</pre>
<p>上面的代码会抛出经典的NullReferrenceException。但是当你在调试状态下运行时，Visual Studio会将代码停在catch这一行，而不是Console.WriteLine这一行。</p>
<p><img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/10/image_thumb5.png" width="304" height="116" /> </p>
<p>如果代码简单那倒无所谓，但是假想我们的代码是经过层层的函数调用，最外层却加了这么个Try-Catch，那么异常函数调用内抛出了异常，我们也很难定位到异常出错的代码（StackTrace也只能定位哪一个函数调用出错了）。</p>
<p>这个行为可以通过Debug菜单中的Exception….菜单进行设置。</p>
<p><img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/10/image_thumb6.png" width="558" height="214" /> </p>
<p>打开此菜单，在CLR异常的Thrown列打上勾，那么以后遇到CLR的异常就不再是定位到用户处理代码了，而是直接停在抛出异常的代码上。这样可以大大方便我们调试程序的Bug。</p>
<p><img style="border-right-width: 0px; margin: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/10/image_thumb7.png" width="465" height="151" /> </p>
<p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/tags/tips" title="Tips" rel="tag">Tips</a>, <a href="http://www.imkevinyang.com/tags/visual-studio" title="Visual Studio" rel="tag">Visual Studio</a>, <a href="http://www.imkevinyang.com/tags/%e5%b0%8f%e8%b4%b4%e5%a3%ab" title="小贴士" rel="tag">小贴士</a>, <a href="http://www.imkevinyang.com/categories/techarticles/toolskills-techarticles" title="工具技巧" rel="tag">工具技巧</a>, <a href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8" title="异常" rel="tag">异常</a>, <a href="http://www.imkevinyang.com/tags/%e6%96%ad%e7%82%b9" title="断点" rel="tag">断点</a>, <a href="http://www.imkevinyang.com/tags/%e8%b0%83%e8%af%95" title="调试" rel="tag">调试</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/08/firebug%e5%9c%a8edithtml%e6%97%b6%e4%b8%a2%e5%a4%b1%e4%ba%8b%e4%bb%b6%e5%a4%84%e7%90%86%e5%87%bd%e6%95%b0-2.html" title="Firebug在EditHtml时丢失事件处理函数 (2009/08/19)">Firebug在EditHtml时丢失事件处理函数</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html" title="Javascript中获取出错代码所在文件及行数 (2009/05/18)">Javascript中获取出错代码所在文件及行数</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/06/onenote-tips-%e6%b7%b7%e5%90%88%e4%bd%bf%e7%94%a8%e4%b8%ad%e8%8b%b1%e6%96%87%e5%ad%97%e4%bd%93.html" title="OneNote Tips — 混合使用中英文字体 (2011/06/16)">OneNote Tips — 混合使用中英文字体</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/07/sql-tipsupdate%e8%af%ad%e5%8f%a5%e4%b9%9f%e4%bd%bf%e7%94%a8%e8%a1%a8%e5%88%ab%e5%90%8dtable-alias.html" title="Sql Tips——Update语句也使用表别名(Table Alias) (2010/07/02)">Sql Tips——Update语句也使用表别名(Table Alias)</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/visual-assist%e4%bb%a3%e7%a0%81%e6%8f%90%e7%a4%ba%e4%bd%bf%e7%94%a8%e7%9a%84%e5%ad%97%e7%ac%a6%e4%b8%b2%e6%a8%a1%e7%b3%8a%e5%8c%b9%e9%85%8d%e7%ae%97%e6%b3%95.html" title="Visual Assist代码提示使用的字符串模糊匹配算法 (2009/09/28)">Visual Assist代码提示使用的字符串模糊匹配算法</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/09/visual-studio-2010%e9%87%8d%e5%91%bd%e5%90%8d%e9%87%8d%e6%9e%84%e6%97%b6%e5%87%ba%e7%8e%b0%e7%9a%84%e9%97%ae%e9%a2%98.html" title="Visual Studio 2010重命名重构时出现的问题 (2010/09/29)">Visual Studio 2010重命名重构时出现的问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/05/visual-studio%e7%bb%9f%e8%ae%a1%e6%9c%89%e6%95%88%e4%bb%a3%e7%a0%81%e8%a1%8c%e6%95%b0.html" title="Visual Studio统计有效代码行数 (2009/05/22)">Visual Studio统计有效代码行数</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/07/visual-studio%e7%bc%96%e8%be%91%e5%99%a8%e4%b8%80%e6%ac%a1%e7%bc%a9%e8%bf%9b%e5%8f%8d%e7%bc%a9%e8%bf%9b4%e4%b8%aa%e7%a9%ba%e6%a0%bc.html" title="Visual Studio编辑器一次缩进/反缩进4个空格 (2010/07/04)">Visual Studio编辑器一次缩进/反缩进4个空格</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/vs2010%e7%9a%84ui%e8%ae%be%e8%ae%a1%e5%a4%b1%e8%af%af.html" title="VS2010的UI设计失误 (2010/05/31)">VS2010的UI设计失误</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>枚举导致的WCF Web Service接口返回异常</title>
		<link>http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html</link>
		<comments>http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html#comments</comments>
		<pubDate>Sun, 23 Aug 2009 13:44:58 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[枚举]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html</guid>
		<description><![CDATA[<p>枚举在DotNet中是一个比较特别的类型，因为你可以将任意整数赋值给一个枚举类，而不会导致编译或者运行时异常。不知道为什么要这样设计，感觉在这样的设计下，枚举类就变成弱类型了，丧失了类型安全检测了。曾经就有一次在Silverlight项目中遇到了和枚举类这个设计相关的奇怪问题，调试了半天才解决。</p>
<p>当时&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>枚举在DotNet中是一个比较特别的类型，因为你可以将任意整数赋值给一个枚举类，而不会导致编译或者运行时异常。不知道为什么要这样设计，感觉在这样的设计下，枚举类就变成弱类型了，丧失了类型安全检测了。曾经就有一次在Silverlight项目中遇到了和枚举类这个设计相关的奇怪问题，调试了半天才解决。</p>
<p>当时的症状是这样的，客户端Silverlight程序（当时是Silverlight 2.0 RTM）在调用Web Service返回的时候抛出了一个CommunicationException，这个错误没能提供任何信息，Silverlight把所有的Web Service的异常都替换成这个没有调试意义的异常。我尝试在Web Service端跟了一下，发现程序正常的走到最后一个大括号，没有抛出任何异常。但是返回的时候却还是抛出了这个CommunicationException异常。</p>
<p>Google了一下，实在找不到相关的文章。只能自己分析了。在对涉及到的类做了详尽的检查之后，还是没有检查出什么设计问题来。该标注的属性都标注了。绞尽脑汁，后来终于想起了一丝线索，就是某个类里面定义了一个枚举成员，这个枚举类我之前修改过。我回想起当时的修改，我是把一个成员给删掉了，但是这会有什么关系呢？？我重新跟了一下，重点跟踪和该枚举成员相关的代码，终于发现了在一个数据库查询的时候，返回的枚举成员就是之前删掉的那个成员。由于枚举的设计是允许未定义成员的存在，因此这里不会报错，代码会继续执行直到返回。但是Silverlight客户端Web Service代理在反射此类型的时候则会出错（因为没有对应的枚举成员存在）。遗憾的是，Silverlight对Web Service返回的结果异常的报错机制不能帮我们很好的发现这个问题。我后来测试发现，如果在调用Web Service的时候传入一个非法的成员值，Silverlight是会抛出一个反射类型出错的异常，而且会帮你定位到出错的那个枚举成员上。</p>
<p>后来项目开发中还遇到和这个类似的问题，就是在实例化一个类实例的时候，由于类中使用C#3.0的自动属性特性去定义的枚举成员，成员的初始值是0，而枚举类中并没有0的成员，所以会遇到和上面一样的问题。</p>
<p>实际上，微软给的最佳开发实践中指出了，枚举类的一个设计原则就是，一定要定义一个0值的成员，这样可以避免枚举初始化值无效的问题。</p>
<p align="right">——<a href="http://www.imkevinyang.com/"><em><strong>Kevin Yang</strong></em></a></p>

	标签：<a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/wcf" title="WCF" rel="tag">WCF</a>, <a href="http://www.imkevinyang.com/tags/web-service" title="Web Service" rel="tag">Web Service</a>, <a href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8" title="异常" rel="tag">异常</a>, <a href="http://www.imkevinyang.com/tags/%e6%9e%9a%e4%b8%be" title="枚举" rel="tag">枚举</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html" title="Javascript中获取出错代码所在文件及行数 (2009/05/18)">Javascript中获取出错代码所在文件及行数</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/02/silverlight-2-rtm-%e5%a4%9a%e5%9b%bd%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81%ef%bc%88%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%9c%ac%e5%9c%b0%e5%8c%96%ef%bc%89.html" title="Silverlight 2 RTM 多国语言支持（应用程序本地化） (2009/02/28)">Silverlight 2 RTM 多国语言支持（应用程序本地化）</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/silverlight-4ria-services-%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96seo.html" title="Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO) (2010/05/04)">Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO)</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/silverlight-seo%ef%bc%88%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96%ef%bc%89%e7%99%bd%e7%9a%ae%e4%b9%a6.html" title="Silverlight SEO（搜索引擎优化）白皮书 (2009/04/06)">Silverlight SEO（搜索引擎优化）白皮书</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html" title="Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly) (2009/03/02)">Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/09/silverlight%e4%b8%ad%e6%97%a0%e6%b3%95%e8%ae%be%e7%bd%ae%e5%8d%ab%e6%98%9f%e7%a8%8b%e5%ba%8f%e9%9b%86%e4%b8%ba%e4%b8%ad%e7%ab%8b%e8%b5%84%e6%ba%90%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight中无法设置卫星程序集为中立资源程序集 (2011/09/05)">Silverlight中无法设置卫星程序集为中立资源程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/03/silverlight%e7%9a%84%e4%be%9d%e8%b5%96%e5%b1%9e%e6%80%a7%e4%b8%8e%e9%99%84%e5%8a%a0%e5%b1%9e%e6%80%a7.html" title="Silverlight的依赖属性与附加属性 (2010/03/28)">Silverlight的依赖属性与附加属性</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/08/%e6%9e%9a%e4%b8%be%e5%af%bc%e8%87%b4%e7%9a%84wcf-web-service%e6%8e%a5%e5%8f%a3%e8%bf%94%e5%9b%9e%e5%bc%82%e5%b8%b8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript中获取出错代码所在文件及行数</title>
		<link>http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html</link>
		<comments>http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html#comments</comments>
		<pubDate>Sun, 17 May 2009 16:00:50 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Web传统技术]]></category>
		<category><![CDATA[代码库]]></category>
		<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[出错文件名]]></category>
		<category><![CDATA[出错行数]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[异常处理机制]]></category>
		<category><![CDATA[错误]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html</guid>
		<description><![CDATA[<p>之前在做一个Javascript的日志控制台功能模块，希望能够在Javascript代码出错时捕获此错误，并将出错的文件及相应的行数打印到控制台并汇报给服务器。原先使用的是try-catch的方式，在catch语句中，我们会收到一个Error对象（我们也可以抛出一个自定义异常对象）。Firefox中&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>之前在做一个Javascript的日志控制台功能模块，希望能够在Javascript代码出错时捕获此错误，并将出错的文件及相应的行数打印到控制台并汇报给服务器。原先使用的是try-catch的方式，在catch语句中，我们会收到一个Error对象（我们也可以抛出一个自定义异常对象）。Firefox中的Error对象拥有如下属性：</p>
<ul>
<li><b>message&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 错误提示信息</li>
<li><b>fileName&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 表示出错代码所在文件</li>
<li><b>lineNumber&#160;&#160;&#160;&#160;&#160; </b>—— 出错代码所在行数</li>
<li><b>stack&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 出错堆栈信息</li>
<li><b>name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 异常对象名/类型</li>
</ul>
<p>但是在IE下，Error对象只有如下属性：</p>
<ul>
<li><b>name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 异常对象名/类型，和Firefox中显示的名称可能不同</li>
<li><b>message&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 错误提示信息</li>
<li><b>description&#160;&#160;&#160;&#160;&#160; </b>—— 和message属性相同</li>
<li><b>number&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— ErrorCode，错误代码，对于普通开发人员来说基本没意义</li>
</ul>
<p>也就是说在IE下我们无法获得最希望得到的错误代码所在文件名及出错行数的信息。后来在学校论坛求教之后知道了window（全局对象）下有一个onerror的对象。这个对象或者说window的属性绑定的是一个错误处理函数。脚本中任何未被捕获的错误最终都会扩散到window这一层，然后被onerror绑定的处理函数所处理。查了一下相关文档，发现绑定的错误处理函数会接受到三个参数：</p>
<pre class="csharpcode"><span class="kwrd">function</span> onError(message,url,line){}</pre>
<p>非常欣慰的是，这个机制兼容IE和Firefox。</p>
<p>下面举一个例子：</p>
<pre class="csharpcode"><span class="kwrd">function</span> doSomething(){
    <span class="kwrd">var</span> lastErrorHandler = window.onerror;
    window.onerror = <span class="kwrd">function</span>(message,url,line){
        <span class="rem">// 汇报错误</span>
        alert(<span class="str">&quot;执行&quot;</span> + url + <span class="str">&quot;文件中的第&quot;</span> + line + <span class="str">&quot;行代码出错，错误信息：&quot;</span> + message);
        window.onerror = lastErrorHandler;
        <span class="rem">// 不希望此错误继续扩散</span>
        <span class="kwrd">return</span> <span class="kwrd">true</span>;
    };
    <span class="rem">// 不小心出错了...</span>
    sldfjlskdjflj;

    window.onerror = lastErrorHandler;
}
doSomething();</pre>
<p><img style="border-right-width: 0px; margin: 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.imkevinyang.com/wp-content/uploads/2009/05/image-thumb2.png" width="595" height="113" /> </p>
<p>这里之所以没用attachEvent的方式，是因为detach比较不方便。如果希望此错误处理变成全局的，那么可以使用attachEvent（Firefox下是addEventListener）的方式。 </p>
<p>需要注意，Safari（Chrome使用的也是一样的内核）和Opera都不支持此机制，这两个核心的浏览器都不支持全局的error事件，因此没法使用这种方式来捕获异常信息，只能使用try-catch的方式。</p>
<p>试验了一下，在Safari中的Error对象拥有如下属性：</p>
<ul>
<li><b>message&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 错误提示信息</li>
<li><b>line&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 出错代码所在行数</li>
<li><b>sourceId&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 一个数字，不明白什么意思</li>
<li><strong>sourceURL&#160;&#160;&#160;&#160;&#160;&#160; ——</strong> 表示出错代码所在文件</li>
<li><strong>name</strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; —— 异常对象名/类型</li>
</ul>
<p>Opera下的Error对象拥有如下属性：</p>
<ul>
<li><b>message&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 错误提示信息</li>
<li><strong>opera#sourceloc&#160;&#160;&#160; </strong>—— 出错代码所在行数</li>
<li><b>stacktrace&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </b>—— 出错堆栈信息 </li>
</ul>
<p>这两个浏览器中的Error对象已经提供了足够的信息给我们调试使用了。下面要做的就是把这两种方式结合起来，使之在不同浏览器下都能很好的汇报这些错误。</p>
<p>下面这段代码封装了在不同浏览器之上汇报异常的功能：</p>
<pre class="csharpcode">&lt;script type=”text/javascript”&gt;
<span class="kwrd">function</span> reportError(err){
    <span class="kwrd">var</span> errMsg = [];
    <span class="kwrd">for</span>(<span class="kwrd">var</span> p <span class="kwrd">in</span> err){
        <span class="kwrd">if</span>(err.hasOwnProperty(p)){
            errMsg.push(p + <span class="str">&quot;=&quot;</span> + err[p]);
        }
    }
    alert(errMsg.join(<span class="str">&quot;\n&quot;</span>));
}
<span class="kwrd">function</span> doSomething(){
    <span class="kwrd">var</span> lastErrorHandler = window.onerror;
    window.onerror = <span class="kwrd">function</span>(message, url, line){
        <span class="rem">// 汇报错误</span>
        reportError({
            message: message,
            url: url,
            line: line
        });
        window.onerror = lastErrorHandler;
        <span class="rem">// 不希望此错误继续扩散</span>
     <span class="kwrd">return</span> <span class="kwrd">true</span>;
    }

    <span class="rem">// 不小心出错了...</span>
    sldfjlskdjflj;

    window.onerror = lastErrorHandler;
}
<span class="kwrd">try</span>{
    <span class="rem">// 执行可能出错的代码</span>
   doSomething();
}<span class="kwrd">catch</span>(e){
    <span class="kwrd">if</span>(<span class="str">&quot;\v&quot;</span>==<span class="str">&quot;v&quot;</span>){
        <span class="rem">// 对于IE直接让此错误扩散到最外层</span>
        <span class="kwrd">throw</span> e;
    }<span class="kwrd">else</span>{
        <span class="rem">// 对于其他任意浏览器直接汇报此异常对象</span>
        reportError(e);
    }
}
&lt;/script&gt;</pre>
<p>&#160;</p>
<p align="right">—— <a href="http://www.imkevinyang.com">Kevin Yang</a></p>

	标签：<a href="http://www.imkevinyang.com/tags/javascript" title="Javascript" rel="tag">Javascript</a>, <a href="http://www.imkevinyang.com/categories/techarticles/web%e4%bc%a0%e7%bb%9f%e6%8a%80%e6%9c%af" title="Web传统技术" rel="tag">Web传统技术</a>, <a href="http://www.imkevinyang.com/categories/techarticles/codebase" title="代码库" rel="tag">代码库</a>, <a href="http://www.imkevinyang.com/tags/%e5%87%ba%e9%94%99%e6%96%87%e4%bb%b6%e5%90%8d" title="出错文件名" rel="tag">出错文件名</a>, <a href="http://www.imkevinyang.com/tags/%e5%87%ba%e9%94%99%e8%a1%8c%e6%95%b0" title="出错行数" rel="tag">出错行数</a>, <a href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8" title="异常" rel="tag">异常</a>, <a href="http://www.imkevinyang.com/tags/%e5%bc%82%e5%b8%b8%e5%a4%84%e7%90%86%e6%9c%ba%e5%88%b6" title="异常处理机制" rel="tag">异常处理机制</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a>, <a href="http://www.imkevinyang.com/tags/%e9%94%99%e8%af%af" title="错误" rel="tag">错误</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/11/button%e6%a0%87%e7%ad%be%e9%bc%a0%e6%a0%87%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e8%a7%a6%e5%8f%91%e6%ba%90%e9%97%ae%e9%a2%98.html" title="Button标签鼠标点击事件的触发源问题 (2009/11/27)">Button标签鼠标点击事件的触发源问题</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/ie%e4%b8%ad%e4%bd%bf%e7%94%a8windowopen%e6%89%93%e5%bc%80%e6%96%b0%e7%aa%97%e5%8f%a3%e6%97%b6%e6%97%a0%e6%b3%95%e8%8e%b7%e5%8f%96referrer%e5%af%b9%e8%b1%a1.html" title="IE中使用window.open打开新窗口时无法获取Referrer对象 (2009/03/07)">IE中使用window.open打开新窗口时无法获取Referrer对象</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/07/javajs%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%8c%b9%e9%85%8d%e5%b5%8c%e5%a5%97html%e6%a0%87%e7%ad%be.html" title="Java/Js如何使用正则表达式匹配嵌套Html标签 (2010/07/30)">Java/Js如何使用正则表达式匹配嵌套Html标签</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/07/javascript-%e4%b8%ad%e7%9a%84false%e9%9b%b6%e5%80%bcnullundefined%e5%92%8c%e7%a9%ba%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%af%b9%e8%b1%a1.html" title="Javascript 中的false,零值,null,undefined和空字符串对象 (2009/07/07)">Javascript 中的false,零值,null,undefined和空字符串对象</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/javascript%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%93%88%e5%b8%8c%e5%87%bd%e6%95%b0.html" title="Javascript字符串哈希函数 (2009/04/11)">Javascript字符串哈希函数</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/06/javascript%e6%93%8d%e7%ba%b5cookie.html" title="Javascript操纵Cookie (2009/06/11)">Javascript操纵Cookie</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/visual-studio%e5%b0%8f%e8%b4%b4%e5%a3%ab%e5%8a%a0%e4%ba%86try-catch%e4%b9%9f%e8%83%bd%e8%87%aa%e5%8a%a8%e5%ae%9a%e4%bd%8d%e5%88%b0%e5%bc%82%e5%b8%b8%e4%bb%a3%e7%a0%81.html" title="Visual Studio小贴士&mdash;&mdash;加了Try-Catch也能自动定位到异常代码 (2009/09/18)">Visual Studio小贴士&mdash;&mdash;加了Try-Catch也能自动定位到异常代码</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/%e4%b8%ba%e4%bb%80%e4%b9%88iis77-5%e7%9a%84gzip%e4%b8%8d%e8%b5%b7%e4%bd%9c%e7%94%a8.html" title="为什么IIS7/7.5的Gzip不起作用 (2010/05/08)">为什么IIS7/7.5的Gzip不起作用</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/09/%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%af%b9url%e6%97%a0%e7%bc%9d%e5%88%87%e6%8d%a2http-https.html" title="使用相对Url无缝切换HTTP-HTTPS (2009/09/18)">使用相对Url无缝切换HTTP-HTTPS</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/07/%e5%87%a0%e4%b8%aa%e6%9c%89%e8%b6%a3%e7%9a%84javascript-hack.html" title="几个有趣的Javascript Hack (2010/07/23)">几个有趣的Javascript Hack</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/05/javascript%e4%b8%ad%e8%8e%b7%e5%8f%96%e5%87%ba%e9%94%99%e4%bb%a3%e7%a0%81%e6%89%80%e5%9c%a8%e6%96%87%e4%bb%b6%e5%8f%8a%e8%a1%8c%e6%95%b0.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: www.imkevinyang.com @ 2012-02-08 19:05:18 -->
